Skip to main content
 首页 » 编程设计

c#之带点的括号,正则表达式

2024年02月06日28三少

我想从字符串中删除以点结尾的括号。我使用正则表达式 - @"\([^)]+\)\." 它适用于像这样的字符串 - some text (some text) some (text).,在正则表达式之后我有字符串 - some text (some text) some 但这不适用于这样的字符串 - some text (some text) some (text (text) some). 如何解决?

请您参考如下方法:

“如何解决?” 传统答案:你不能。正则表达式不支持 rested 结构。对于大多数正则表达式方言来说都是如此。


然而,.NET 正则表达式引擎支持平衡组。通过它们,您可以识别和处理嵌套。

要处理嵌套构造,您必须定义其开始和结束模式,在您的情况下,这些是括号 (和 ) , 分别。

  • 打开:(?<paren>\()
  • 关闭:(?<-paren>\))

将其视为一种名为“paren”的计数器,它在遇到 ( 时计数。当遇到)时开始倒计时(在内部,它有点不同,但作为一个比喻,这就足够了)。

现在这两个可以用来定义括号的内容,即

  • 要么是括号:[^()]*
  • 或开头样式
  • 或上方的结束模式

或者,在一个表达式中:(?:[^()]*|(?<paren>\()|(?<-paren>\)))+

当计数器最后不为零时,整个正则表达式应该失败,即括号不平衡。为了实现这一目标,(?(paren)(?!))使用构造(这是一个条件,设计为在有不匹配的 paren 剩余时失败)。

你完成的表达式看起来像这样(忽略空格)

\( 
  (?: 
    [^()]* 
    |(?<paren>\() 
    |(?<-paren>\)) 
  )+ 
  (?(paren)(?!)) 
\)\.$ 

现场观看:http://regexhero.net/tester/?id=feb992a2-cc5d-497a-9d4a-a10317487e46

推荐阅读: