C#Regex用于查找由大括号内部没有数字的花括号包围的字符串

时间:2013-12-19 20:03:17

标签: c# regex string replace

我的问题是这个。我有一些字符串格式,我需要检查一个非常具体的正则表达式,并且无法弄清楚如何正确定位它(正确的正则表达式)。例如,考虑这个字符串。

string str = "Hi {0} I {1} a string."  

然后String.Format将其读取为:

string formattedStr = String.Format(str,there, am);

现在考虑:

"Hi {there} I {1} a string."  

我希望能够找到{there}并将其转义,否则我的String.Format会抛出错误,因为它试图参数化{there},这不起作用。

我认为我应该寻找1)被花括号包围的字符串2)它们之间有超过1个字符。这样我就会忽略{0}{1}之类的内容,但不会忽略{there}{regex}等等。然后我可以根据需要转义它们,以便String.Format不会尝试格式化它们。谢谢!

3 个答案:

答案 0 :(得分:1)

为什么不使用此正则表达式:\{(\s*?.*?)*?\}

然后解析组的内容以查看它是否为数字?如果它不是数字,那么你就会看到你在寻找什么。如果它不是数字,那么你只需将你的转义附加到字符串的开头。

答案 1 :(得分:1)

我可能在这里误解,但不会

\{\D+\}

办?

这转换为“一个开放的花括号后跟一个或多个非数字后跟一个紧密的花括号”。

答案 2 :(得分:0)

要匹配大括号之间的任何内容,您可以使用{[^{}]}正则表达式。因此,为了避免将任何{...}字符串与数字匹配,您需要做的就是将数字匹配模式添加到[^{}]否定字符类中:

{[^{}\d]*}

请参阅regex demo

<强>详情:

  • { - 文字开放{
  • [^{}\d]* - 零或更多(由于*,如果您需要一次或多次,请使用+)除{}以外的字符和数字(如果您需要避免仅匹配ASCII数字,请替换为明确的[0-9]
  • } - 文字关闭}

请参阅C# demo仅显示{there}作为输出:

using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
// ...

var s = "Hi {there} I {1} a string.";
var result = Regex.Matches(s, @"{[^{}\d]*}")
    .Cast<Match>()
    .Select(p => p.Value)
    .ToList();

BONUS :如果您只需要提取{...}之间的内容,请在模式中添加一个捕获组 - @"{([^{}\d]*)}" - 而不是.Select(p => p.Value)在代码中使用.Select(p => p.Groups[1].Value)