我想从字符串中删除以点结尾的括号。我使用正则表达式 - @"\([^)]+\)\."
它适用于像这样的字符串 - 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
推荐阅读:
- What are regular expression Balancing Groups? here on SO (去读吧,太棒了)
- MSDN: Grouping Constructs in Regular Expressions
- regular-expressions.info: Matching Nested Constructs with Balancing Groups
- Flagrant Badassery: Fun With .NET Regex Balancing Groups
- MSDN Blogs: Nested/Recursive Regex and .NET Balancing Groups
关于c# - 带点的括号,正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26968623/