如何在 C# 中使用 Regex 将 [number] 替换为 number - 1?
Posted
技术标签:
【中文标题】如何在 C# 中使用 Regex 将 [number] 替换为 number - 1?【英文标题】:How do I replace [number] to number - 1 using Regex in C#?如何在 C# 中使用 Regex 将 [number] 替换为 number - 1? 【发布时间】:2019-07-29 09:11:15 【问题描述】:我有A, something happened [1], something else [2], whatever [3]
之类的字符串值,想将其替换为A, something happened 0, something else 1, whatever 2
。
因此,如果两者之间有一个数字,则基本上将[
替换为 和
]
与,然后将两者之间的数字减一。以某种方式使用正则表达式可以做到这一点吗?
到目前为止,我得到了这个:
var text = "A, something happened [1], something else [2], whatever [3]";
var result = Regex.Replace(text, @"\[(\d+)\]", @"$1");
Console.Write(result);
但是,这给了我A, something happened 1, something else 2, whatever 3
。
是否可以选择将数字减一?
【问题讨论】:
@Peter B: 感谢编辑,我在那里打错字了... 【参考方案1】:您可以减少匹配评估器中的数字:
var text = "A, something happened [1], something else [2], whatever [3]";
var result = Regex.Replace(text, @"\[(\d+)\]", m => $"int.Parse(m.Groups[1].Value)-1");
Console.Write(result); // => A, something happened 0, something else 1, whatever 2
见C# demo
如果数字不能转换为 int 使用int.TryParse
:
var result = Regex.Replace(text, @"\[(\d+)\]", m =>
int.TryParse(m.Groups[1].Value, out var number) ? $"number - 1" : m.Value);
对于 C#7 之前的 C#:
var result = Regex.Replace(text, @"\[(\d+)\]", m =>
int number;
if (int.TryParse(m.Groups[1].Value, out number))
return $"number-1";
else
return m.Value;
);
【讨论】:
我会试试这个。我想,这就是我要找的:) @FranzHuber23 如果您愿意,可以将int
替换为 long
,只要确保使用最适合您的场景的选项即可。
@Wiktor Stribiżew 我把你的代码放在一行中:var result = Regex.Replace(text, @"\[(\d+)\]", m => int.TryParse(m.Groups[1].Value, out var number) ? $"number - 1" : m.Value);
。当然,如果值是long
,我可以简单地使用long.TryParse
。感谢您的快速回复。
@FranzHuber23 是的,它将从 C#7 开始工作,因为 out
argument "can pass without its declaration and initialization".
@Wiktor Stribiżew 感谢您提供更多信息,我并没有真正寻找 C# 版本,因为我一直在使用最新功能,但很高兴能将这一点告知其他人。以上是关于如何在 C# 中使用 Regex 将 [number] 替换为 number - 1?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 regex.split 在 c# 中解析 html 并返回值数组
如何在 C# Regex 中使用lookbehind 来跳过重复前缀模式的匹配?