将“占位符”与.NET中的特定参数进行匹配

时间:2015-01-22 20:10:38

标签: .net regex

我试图从文本中提取一些有用的数据(具有特定参数的占位符)(一些是原始文本,一些是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是一个数字,...可以是任何数字。

我已经构建了以下正则表达式,几乎完成了这项工作,我想知道是否有办法改进它,或者即使有另一种方法可能要完成这项工作(它必须与.NET正则表达式引擎兼容)

\$
(?=[^$]{3,100}\$)
(?<PH>[A-Za-z0-9:_-]{1,20})
(?:
  (?<C1>\/)
  (?<RX>(?:[^\\\/\r\n]|\\\/?)*)
  \/
  (?:
    (?<R>(?:[^\\\/\r\n$]|\\[\/$]?)*)
    \/
    |
    (?<G>\d*)
  )
  |
  (?:
    (?<C2>\()
    (?<F>(?:[^\t\r\n\f()]|\\[()]?)*)
    \)
  )?
)
\$

DEMO

1 个答案:

答案 0 :(得分:0)

这是一个&#34;改进的&#34;使用()和{}的平衡组的正则表达式的版本。捕获组命名为&#34; ph&#34;,&#34; FirstSep&#34;,&#34; value1&#34;,&#34; value2&#34;,&#34; value3&#34; (为简单起见,您可以根据需要重命名):

\$
(?=[^$]{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/

有关匹配带有转义分隔符的分隔字符串的详细信息:Finding quoted strings with escaped quotes in C# using a regular expression