.net - 用于删除由有序字符集组成的嵌套括号的平衡匹配正则表达式是什么?

标签 .net regex xml cdata parentheses

在这个问题之后:

https://stackoverflow.com/a/24591578/1329812

我正在尝试使用平衡匹配来替换括号内的所有项目,但在示例中括号是 "{{""}}" .而我的括号是 "<![CDATA[""]]>" .

我在修改 [^{}] 时遇到问题上一个问题的已接受答案中的正则表达式部分改为使用我的括号版本。我试过修改 [^{}](?!(<!\[CDATA\|\]\]>)) .

我已将问题简化为使用 12 作为左括号,34 作为右括号。以下按预期返回“STST”。

using System.Text.RegularExpressions;

Regex.Replace(
12T1212E343434STST12RING34',--input
'12(?!(12|34))*(((?<Open>12)(?!(12|34))*)+((?<Close-Open>34)(?!(12|34))*)+)*(?(Open)(?!))34',--pattern
''--replacement
);

但是如果我替换 12 它就不起作用了与 <!\[CDATA\[" and 34 with "\]\]> .

最后,我想对以下 CDATA 示例字符串进行操作:

"<![CDATA[t<![CDATA[e]]>]]>stst<![CDATA[ring]]>"

应该返回

"stst"

最佳答案

您当前的 12...34匹配的正则表达式不正确,因为 tempered greedy token使用的是“损坏的”((?!(12|34))* 缺少消费部分,.)。

你只需要记住正则表达式的部分:1) 前导分隔符模式,2) 尾随分隔符模式,3) 中间部分应该匹配不是 1 和 2 的部分,4) the conditional construct检查“技术”组捕获堆栈是否为空。

因此,数字正则表达式可以固定为

12(?>(?!12|34).|(?<o>)12|(?<-o>)34)*(?(o)(?!))34

( regex demo ) 和 CDATA 看起来像

<!\[CDATA\[(?>(?!<!\[CDATA\[|]]>).|(?<o>)<!\[CDATA\[|(?<-o>)]]>)*(?(o)(?!))]]>

参见 this regex demo

注意:如果字符串输入中可以有换行符,使用RegexOptions.Singleline选项或内联修饰符版本,(?s) , 在模式开始处。

图案细节:

  • 12 - 领先的定界符模式
  • (?> - 将匹配既不是前导模式也不是尾随模式的原子组的开始,并将跟踪那些定界子字符串:
    • (?!12|34).| - 匹配任何字符(如果使用 RegexOptions.Singleline 选项,甚至包括换行符)但作为 12 起点的字符或 34序列
    • (?<o>)12| - match 12` 并递增“o”组捕获堆栈,或者
    • (?<-o>)34 - 匹配 34并递减“o”组捕获堆栈
  • )* - 并重复(保持匹配)原子组内模式的零次或多次出现
  • (?(o)(?!)) - 将检查“o”组捕获堆栈是否为空的条件构造。如果不为空,将触发回溯,并搜索平衡数量的前导/尾随分隔符。
  • 34 - 尾随分隔符模式。

此外,[<![CDATA[必须转义,如 [是字符类之外的特殊字符,]]]>不必转义,因为在字符类之外,]对于 .NET 正则表达式来说并不特殊。

关于.net - 用于删除由有序字符集组成的嵌套括号的平衡匹配正则表达式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46343803/

相关文章:

.net - 为什么存在 String.Format 的重载?

c# - 为什么我在 RestSharp 中的初始调用真的很慢?但其他人之后非常快

c# - 方法签名、重载、覆盖 : are all these terms related?

javascript - 使用正则表达式获取div内的部分文本

javascript - 如何使用 Regex 和 javascript 进行过滤?

java - 自定义带有边框的Android TextView,并使用for循环创建多个?

xml - 自动将 XML 数据收集到电子表格

java - Eclipse Android 开发 - [I18N] 硬编码字符串 "TextView",应该使用 @string 资源

.net - 强制 DataGridView 单元格仅接受数字输入的最佳方法是什么?

php - 阅读网站页面