C# 匹配字符前的平衡圆括号
我需要在c#中的文字句点之前匹配平衡括号中的字符串。我的带有平衡组的正则表达式可以工作,除非字符串中有额外的开放paren。根据我的理解,这需要一个条件失败模式来确保堆栈在匹配时为空,但有些地方不太正确 原始正则表达式:C# 匹配字符前的平衡圆括号,c#,regex,balanced-groups,C#,Regex,Balanced Groups,我需要在c#中的文字句点之前匹配平衡括号中的字符串。我的带有平衡组的正则表达式可以工作,除非字符串中有额外的开放paren。根据我的理解,这需要一个条件失败模式来确保堆栈在匹配时为空,但有些地方不太正确 原始正则表达式: @“(?[(]).+(?[)])\” 具有失败模式: @“(?[(])。+(?[)))(?(Par)(?!)\” 测试代码(最后2次失败): string[]测试={ “a.c”、“”、, "a.c,",, “(a.c.,”, “a(a.c)”,“(a)。”, “a(ab.c)
@“(?[(]).+(?[)])\”
具有失败模式:
@“(?[(])。+(?[)))(?(Par)(?!)\”
测试代码(最后2次失败):
string[]测试={
“a.c”、“”、,
"a.c,",,
“(a.c.,”,
“a(a.c)”,“(a)。”,
“a(ab.c)”,“(a b)。”,
"(a b).c","(a b)",,
"a(((a b)).c","((a b))",,
"(a)(b).c","(a)(b))",,
"(a)(b).c","(a)(b))",,
“a((ab)).c”、“((ab)).”,
“a)((ab))(c)”,“((ab))”,
"(a b).c","(a b)",,
“a((a b)))”c“,((a b))。”
};
正则表达式re=新正则表达式(@“(?[(])+(?[)))(?(Par)(?!)\”;
对于(int i=0;i
您可以使用一个著名的正则表达式来匹配平衡括号,只需在其上附加一个\。
:
\((?>[^()]+|(?<o>)\(|(?<-o>)\))*(?(o)(?!))\)\.
|---------- balanced parens part ----------|.|
\((?>[^()])+(?)\(?)\(?)\)*(?(o)(?!)\)\。
|----------平衡帕伦斯部分---------------|
看
详细信息
-a\(
(
-原子组的开始(?>
-1个或多个字符,而不是[^()]+
和(
)
-或|
-一个开口(?)\(
被推到组(
堆栈上o
-或|
-从组(?)\)
堆栈中弹出一个关闭o
)(
-原子群的0个或更多重复)*
-如果组(?(o)(?!)
堆栈不为空,则匹配失败o
-a\)
)
-一个点\。
,所以我们应该这样做k、 刚刚在RegexHero.net上测试过,如果将\(
和\)
包含在组“o”中,该模式的运行速度似乎会更快:\((?>[^()]+|(?\()))*(?(o)(?!)\。
\((?>[^()]+|(?<o>)\(|(?<-o>)\))*(?(o)(?!))\)\.
|---------- balanced parens part ----------|.|