c# - 带点的括号,正则表达式

标签 c# regex

我想从字符串中删除以点结尾的括号。我使用正则表达式 - @"\([^)]+\)\." 它适用于像这样的字符串 - 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

推荐阅读:

关于c# - 带点的括号,正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26968623/

相关文章:

regex - 字符串中字符位置的转义字符 : R lang

javascript - 由两个逗号分隔的三个单词的正则表达式

javascript - 动态创建正则表达式组以匹配低于或高于所需值的模式

SQL 注释中的 Java Regex 查找/替换模式

c# - 我如何摆脱多余的列?

c# - 如何将变量严格键入为特定 WMI 类?

c# - 我如何生成带有捕获变量的嵌套 lambda 表达式

仅匹配 JavaScript 样式数字的 Javascript 正则表达式

c# - Microsoft VSrollBar 行为或触摸屏错误 - Windows 窗体

c# - 当字体不支持符号时,如何在WPF文本框中插入版权,商标,服务标记等