Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 用于删除由有序字符集组成的嵌套方括号的平衡匹配正则表达式是什么?_.net_Regex_Xml_Cdata_Parentheses - Fatal编程技术网

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

.net 用于删除由有序字符集组成的嵌套方括号的平衡匹配正则表达式是什么?,.net,regex,xml,cdata,parentheses,.net,Regex,Xml,Cdata,Parentheses,就这个问题: 我试图使用平衡匹配来替换括号内的所有项目,但在示例中括号是“{{{”和“}}”。而我的括号是” 我在修改前一个问题的已接受答案中正则表达式的[^{}]部分时遇到问题,无法使用我的括号版本。我试图将[^{}]修改为(?!()) 我已将问题简化为使用12作为开放支架,使用34作为封闭支架。下面的语句按预期返回“STST” using System.Text.RegularExpressions; Regex.Replace( 12T1212E343434STST12RING34',

就这个问题:

我试图使用平衡匹配来替换括号内的所有项目,但在示例中括号是
“{{{”
“}}”
。而我的括号是

我在修改前一个问题的已接受答案中正则表达式的
[^{}]
部分时遇到问题,无法使用我的括号版本。我试图将
[^{}]
修改为
(?!())

我已将问题简化为使用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
);
应该回来

"stst"

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

您只需要记住正则表达式的如下部分:1)前导定界符模式,2)尾随定界符模式,3)中间的部分应该匹配1和2之外的部分,4)检查“技术”组捕获堆栈是否为空的部分

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

12(?>(?!12|34).|(?<o>)12|(?<-o>)34)*(?(o)(?!))34
12(?>(?!12 | 34)。(?)12 |(?)34)*(?(o)(?!)34
()和CDATA的外观

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

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

图案细节

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

另外,必须对
中的
[
进行转义,因为
[
是字符类之外的特殊字符,而
]
中的
不必进行转义,因为在字符类之外,
]
对于.NET正则表达式并不特殊。

这是一个与.NET兼容的正则表达式引擎吗?是的,它的.NET我错过了一个。在Regex和Replace之间。好吧,不管你怎么想,你的Regex都不起作用,因为
[^(12 | 34)]
以外的单个字符匹配(
1
2
3
4
)。这--是正确的。谢谢,我已经将[^(12 | 34)]编辑到(?(12 | 34))我更新了上面的评论。如果您想要更具体的答案,请提供一个带有
CDATA
的示例。难以置信!感谢您对答案的进一步了解,文本中确实包含换行符,因此我目前正在使用模式“(?)(?!).(?)]]>)*(?(o)(?))]>”@Dannylancher:如果没有换行符,您可以删除
(?s)
,也就是在匹配LF符号后使所有
都匹配的DOTALL/Singleline修饰符。好的,谢谢,我试图将一些较大的字符串简化为一系列的CDATA“括号”什么是识别CDATA括号并仅保留它们的正则表达式
(?>(?!)
?@DannyRancher这是不同的。什么是示例测试用例?
]>stst
,输出是…使用您评论中的示例测试用例,我正在尝试生成
]>
<!\[CDATA\[(?>(?!<!\[CDATA\[|]]>).|(?<o>)<!\[CDATA\[|(?<-o>)]]>)*(?(o)(?!))]]>