如何在 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 并返回值数组

如何使用 REGEX 将作者拆分为对象或数组 C#?

如何在 C# Regex 中使用“或”、“和”?

如何在 C# Regex 中使用lookbehind 来跳过重复前缀模式的匹配?

如何使用 regex.match 在 c# 中提取字符串的特定部分? [复制]

C# Regex.Split,如何将字符串拆分为用括号括起来而不是用括号括起来?