带点的括号,正则表达式

本文关键字:正则表达式 | 更新日期: 2023-09-27 18:30:34

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

带点的括号,正则表达式

"如何修复它?"传统答案:你不能。正则表达式不支持静态构造。对于大多数正则表达式方言来说都是如此。


但是,.NET 正则表达式引擎支持平衡组。有了它们,您可以识别和处理嵌套。

若要处理嵌套构造,必须定义其开始和结束模式,在本例中,这些模式分别是括号()

  • 开盘: (?<paren>'()
  • 关闭: (?<-paren>'))

把它想象成一种名为"paren"的计数器,当它遇到(时倒数,当它遇到)时倒数(在内部,它有点不同,但作为一个比喻,这就足够了)。

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

  • 要么除了括号之外的任何内容:[^()]*
  • 或开场模式
  • 或从上方关闭模式

或者,用一个表达式来说:(?:[^()]*|(?<paren>'()|(?<-paren>')))+

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

完成的表达式如下所示(忽略空格)

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

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

推荐阅读:

  • 什么是正则表达式平衡组? 在SO上(去读吧,太棒了)
  • MSDN:对正则表达式中的构造进行分组
  • regular-expressions.info:将嵌套构造与平衡组匹配
  • 公然的坏蛋:.NET 正则表达式平衡组的乐趣
  • MSDN 博客:嵌套/递归正则表达式和 .NET 平衡组

只需像下面这样更改您的正则表达式以匹配以 . 结尾的括号

@"'((?:[^()]*'([^()]*'))*[^()]*')'."

演示

正则表达式:

'(                       '('
(?:                      group, but do not capture (0 or more
                         times):
  [^()]*                   any character except: '(', ')' (0 or
                           more times)
  '(                       '('
  [^()]*                   any character except: '(', ')' (0 or
                           more times)
  ')                       ')'
)*                       end of grouping
[^()]*                   any character except: '(', ')' (0 or more
                         times)
')                       ')'
'.                       '.'