带点的括号,正则表达式
本文关键字:正则表达式 | 更新日期: 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)
') ')'
'. '.'