我想删除以字符串结尾的点的brakets。我使用常规表达 - @"\([^)]+\)\."
它使用像这样的字符串 - some text (some text) some (text).
,在正则表达式后我有字符串 - some text (some text) some
但这不适用于那样的字符串 - some text (some text) some (text (text) some).
如何解决?
答案 0 :(得分:3)
“如何解决?”传统答案:你不能。正则表达式不支持rested构造。对于那里的大多数正则表达方言都是如此。
然而,.NET正则表达式引擎支持平衡组。使用它们,您可以识别和处理嵌套。
要处理嵌套构造,必须定义其开始和结束模式,在您的情况下,分别是括号(
和)
。
(?<paren>\()
(?<-paren>\))
将此视为一种名为“paren”的计数器,它在遇到(
时会计数,并在遇到)
时倒计时(内部,它有点不同,但作为一个比喻已经足够了。
现在这两个可以用来定义括号的内容,即
[^()]*
或者,在一个表达式中:(?:[^()]*|(?<paren>\()|(?<-paren>\)))+
当计数器最后不为零时,整个正则表达式应该失败,即括号不平衡。为了实现这一点,使用了(?(paren)(?!))
构造(这是一个条件,设计为在剩下不匹配的paren
时失败。)
你完成的表达式看起来像这样(忽略空格)
\(
(?:
[^()]*
|(?<paren>\()
|(?<-paren>\))
)+
(?(paren)(?!))
\)\.$
现场直播:http://regexhero.net/tester/?id=feb992a2-cc5d-497a-9d4a-a10317487e46
推荐阅读:
答案 1 :(得分:1)
只需更改下面的正则表达式即可匹配以.
@"\((?:[^()]*\([^()]*\))*[^()]*\)\."
正则表达式:
\( '('
(?: 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)
\) ')'
\. '.'