我试图从文本中提取一些有用的数据(具有特定参数的占位符)(一些是原始文本,一些是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()]|\\[()]?)*)
\)
)?
)
\$
答案 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。