我的问题是这个。我有一些字符串格式,我需要检查一个非常具体的正则表达式,并且无法弄清楚如何正确定位它(正确的正则表达式)。例如,考虑这个字符串。
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
不会尝试格式化它们。谢谢!
答案 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)
。