我有一个要解析的字符串。首先,我必须检查字符串是否包含特殊模式:
我在C#中有一点正则表达式
string input = "$(abc)";
string pattern = @"\$\(([^$][^\s]*)\)";
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
MatchCollection matches = rgx.Matches(input);
foreach (var match in matches)
{
Console.WriteLine("value = " + match);
}
它适用于很多情况但输入失败= $($ $(),表达式内部为空。我想在输入为$()时不匹配。[开始和结束标识符之间没有任何内容]。
我的正则表达式出了什么问题?
答案 0 :(得分:3)
注意:[^$]
匹配单个字符但不匹配$
如果您想匹配$()
\$\(([^\s$]*)\)
如果您不想匹配$()
,
\$\(([^\s$]+)\)
*
重复前面的令牌零次或多次。+
重复前一个令牌一次或多次。您的正则表达式\(([^$][^\s]*)\)
是错误的。它不允许$
作为()
内的第一个字符,但它允许它作为第二个或第三个,等等。请参阅演示here。您需要在正则表达式中组合否定的类,以匹配任何不是空格或$
的字符。
答案 1 :(得分:2)
您当前的正则表达式不匹配$()
,因为[^$]
至少匹配1个字符。我能想到你将匹配这个匹配的唯一方法是当你有一个包含多个parens的输入时,例如:
$()(something)
在这些情况下,您还需要至少排除结束语:
string pattern = @"\$\(([^$\s)]+)\)";
以上匹配例如:
abc
和中$(abc)
{li> abc
和def
中的$(def)$()$(abc)(something)
。答案 2 :(得分:1)
只需用+替换*并合并选项。
string pattern = @"\$\(([^$\s]+)\)";
+表示1个或更多
*表示0或更多