带圆点,正则表达式的括号

时间:2014-11-17 08:41:51

标签: c# regex

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

2 个答案:

答案 0 :(得分:3)

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


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

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

  • open:(?<paren>\()
  • close:(?<-paren>\))

将此视为一种名为“paren”的计数器,它在遇到(时会计数,并在遇到)时倒计时(内部,它有点不同,但作为一个比喻已经足够了。

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

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

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

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

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

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

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

推荐阅读:

答案 1 :(得分:1)

只需更改下面的正则表达式即可匹配以.

结尾的括号
@"\((?:[^()]*\([^()]*\))*[^()]*\)\."

DEMO

正则表达式:

\(                       '('
(?:                      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)
\)                       ')'
\.                       '.'