Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 匹配字符前的平衡圆括号_C#_Regex_Balanced Groups - Fatal编程技术网

C# 匹配字符前的平衡圆括号

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)

我需要在c#中的文字句点之前匹配平衡括号中的字符串。我的带有平衡组的正则表达式可以工作,除非字符串中有额外的开放paren。根据我的理解,这需要一个条件失败模式来确保堆栈在匹配时为空,但有些地方不太正确

原始正则表达式:

@“(?[(]).+(?[)])\”

具有失败模式:

@“(?[(])。+(?[)))(?(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
  • \。
    -一个点

以防万一这是XY问题()你能分享一下你为什么要这么做吗?在我看来,不要使用正则表达式来解决括号平衡问题。走粗糙的路线。你似乎喜欢正则表达式的恐怖,考虑到这是关于正则表达式和平衡括号的第二个问题。我认为这是一个经典的使用平衡结构的例子,后面有一个
,所以我们应该这样做k、 刚刚在RegexHero.net上测试过,如果将
\(
\)
包含在组“o”中,该模式的运行速度似乎会更快:
\((?>[^()]+|(?\()))*(?(o)(?!)\。
\((?>[^()]+|(?<o>)\(|(?<-o>)\))*(?(o)(?!))\)\.
|---------- balanced parens part ----------|.|