匹配a";占位符;在.NET中使用特定参数

匹配a";占位符;在.NET中使用特定参数,.net,regex,.net,Regex,我试图从文本(一些是原始文本,一些是xml)中提取一些有用的数据(带有特定参数的占位符) 有用的部分用以下任一项分隔:$,%,[],{} 下面的示例以$给出,并显示了我感兴趣的不同可能的内容 $EX1$ -> EX1 $EX2(a$b$c)$ -> EX2, (, a$b$c $EX3(abc\x/)$ -> EX3, (, abc\x/ $EX4(\@\,/&

我试图从文本(一些是原始文本,一些是xml)中提取一些有用的数据(带有特定参数的占位符)

有用的部分用以下任一项分隔:
$,%,[],{}

下面的示例以
$
给出,并显示了我感兴趣的不同可能的内容

 $EX1$                       -> EX1
 $EX2(a$b$c)$                -> EX2, (, a$b$c
 $EX3(abc\x/)$               -> EX3, (, abc\x/
 $EX4(\@\,/&/)$              -> EX4, (, \@\,/&/
 $EX5/X(Z)Y/$                -> EX5, /, X(Z)Y
 $EX6/X(ABC)/1$              -> EX6, /, X(ABC), 1
 $EX7/X\\Z\/Y/$              -> EX7, /, X\\Z\/Y
 $EX8/(A)/(B)/$              -> EX8, /, (A), (B)
 $EX9/(\\$A$)\//(\\$B$\/)/$  -> EX9, /, (\\$A$)\/, (\\$B$\/)
第一部分是占位符名称,可选地后跟一些参数,如
(…)
/…/
/…/xx
/…/
其中,
xx
是一个数字,
可以是任何东西

我已经构建了下面的regex witch,它几乎可以完成这项工作,我想知道是否有改进的方法,或者是否有其他方法可以完成这项工作(它必须与.NET regex引擎兼容)

\$
(?=[^$]{3,100}\$)
(?[A-Za-z0-9:{1,20})
(?:
(?\/)
(?(?:[^\\\/\r\n]\\\\/?)*)
\/
(?:
(?(?:[^\\\/\r\n$]\\\[\/$]?)*)
\/
|
(?\d*)
)
|
(?:
(?\()
(?(?:[^\t\r\n\f()
\)
)?
)
\$

这里是一个“改进”版本的正则表达式,它使用()和{}的平衡组。捕获组的名称为“ph”、“FirstSep”、“value1”、“value2”、“value3”(为了测试的简单性,您可以随意重命名它们):


有关将分隔字符串与内部转义分隔符进行匹配的详细信息:。

看起来
/
()
也是示例中的分隔符,是这样吗?也似乎是您的代码中的
多行
?regex还必须接受通过\right?@CS转义ᵠ 是,()和/是“第二级”分隔符。正则表达式必须接受通过“\”转义。什么是多行?分隔符之间的内容不能包含“\n”(如果包含,$placeholder(…)$必须忽略)字符,但文本本身可以。
\$
(?=[^$]{3,100}\$)
(?<PH>[A-Za-z0-9:_-]{1,20})
(?:
  (?<C1>\/)
  (?<RX>(?:[^\\\/\r\n]|\\\/?)*)
  \/
  (?:
    (?<R>(?:[^\\\/\r\n$]|\\[\/$]?)*)
    \/
    |
    (?<G>\d*)
  )
  |
  (?:
    (?<C2>\()
    (?<F>(?:[^\t\r\n\f()]|\\[()]?)*)
    \)
  )?
)
\$
\$
(?=[^$]{3,100}\$)
(?<ph>[\w\:\-]+)
(?:(?<FirstSep>[\/\(\{])(?<value1>
    (?>
        [^{}()]+ 
        |    [\(\{] (?<number>)
        |    [\)\}] (?<-number>)
    )*
    (?(number)(?!))
)
[\)\}]
)?
(?:(?<FirstSep>/)
     (?<value2>
          \d+  |
          [^/\r\n\\]*(?>\\.[^/\r\n\\]*)*
      )?
)?
(?:/
     (?<value3>[^/\r\n\\]*(?>\\.[^/\r\n\\]*)*
      )?
)?
/?
\$
$EX2(a($b)$c)$          --> EX2, (, a($b)$c 
$EX3{a({bc})\x/}$       --> EX3, {, a({bc})\x/