否定字符 class 的 C# 正则表达式,除非字符彼此相邻
C# regex for negated character class unless chars are next to one another
我需要匹配字符串中最里面的一组括号之间的字符,但允许空括号,例如“()”。尽我所能告诉你这里需要某种消极的前瞻(它与它被标记为重复的问题完全不同)
不正确包含'()'的初始版本是:
var re = new Regex(@"\(([^()]+)\)");
一些测试例子:
x (a) y -> a
x (a b) y -> a b
x (a b c) y -> a b c
x (a b() c) y -> a b() c
x (a() b() c) y -> a() b() c
x (a b() c()) y -> a b() c()
x (a b(a) c) y -> a
x (a (b() c)) y -> b() c
x () y -> empty
和一个 c# 测试方法(适用于您的断言库):
var re = new Regex(@"\(([^()]+)\)");
string[] tests = {
"x (a) y", "a",
"x (a b) y", "a b",
"x (a b c) y", "a b c",
"x (a b() c) y", "a b() c",
"x (a() b() c) y", "a() b() c",
"x (a b() c()) y", "a b() c()",
"x (a b(a) c) y", "a",
"x (a (b() c)) y", "b() c",
"x () y", ""
};
for (int i = 0; i < tests.Length; i+=2)
{
var match = re.Match(tests[i]);
var result = match.Groups[1].Value;
Assert.That(result, Is.EqualTo(tests[i + 1]));
}
你可以使用这样的东西:(不需要 Lookarounds)
\(((?:[^()]|\(\))+)\)
对您的正则表达式所做的调整:
在非捕获组中添加了 [^()]
以及替代 |\(\)
以便它可以匹配 [=14= 以外的字符] 和 )
或 空括号 ()
.
或者,如果您不需要捕获组,您可以去掉捕获组,并使用像这样的环视使您的匹配成为完全匹配而不是组:
(?<=\()(?:[^()]|\(\))+(?=\))
这样,您可以使用 match.Value
而不是 match.Groups[1].Value
直接访问您的比赛。
如果有什么不清楚的地方请告诉我。
我需要匹配字符串中最里面的一组括号之间的字符,但允许空括号,例如“()”。尽我所能告诉你这里需要某种消极的前瞻(它与它被标记为重复的问题完全不同)
不正确包含'()'的初始版本是:
var re = new Regex(@"\(([^()]+)\)");
一些测试例子:
x (a) y -> a
x (a b) y -> a b
x (a b c) y -> a b c
x (a b() c) y -> a b() c
x (a() b() c) y -> a() b() c
x (a b() c()) y -> a b() c()
x (a b(a) c) y -> a
x (a (b() c)) y -> b() c
x () y -> empty
和一个 c# 测试方法(适用于您的断言库):
var re = new Regex(@"\(([^()]+)\)");
string[] tests = {
"x (a) y", "a",
"x (a b) y", "a b",
"x (a b c) y", "a b c",
"x (a b() c) y", "a b() c",
"x (a() b() c) y", "a() b() c",
"x (a b() c()) y", "a b() c()",
"x (a b(a) c) y", "a",
"x (a (b() c)) y", "b() c",
"x () y", ""
};
for (int i = 0; i < tests.Length; i+=2)
{
var match = re.Match(tests[i]);
var result = match.Groups[1].Value;
Assert.That(result, Is.EqualTo(tests[i + 1]));
}
你可以使用这样的东西:(不需要 Lookarounds)
\(((?:[^()]|\(\))+)\)
对您的正则表达式所做的调整:
在非捕获组中添加了 [^()]
以及替代 |\(\)
以便它可以匹配 [=14= 以外的字符] 和 )
或 空括号 ()
.
或者,如果您不需要捕获组,您可以去掉捕获组,并使用像这样的环视使您的匹配成为完全匹配而不是组:
(?<=\()(?:[^()]|\(\))+(?=\))
这样,您可以使用 match.Value
而不是 match.Groups[1].Value
直接访问您的比赛。
如果有什么不清楚的地方请告诉我。