使用正则表达式解析标记的参数字符串

时间:2011-07-01 14:26:49

标签: regex

任何人都可以帮我这个吗?

我的目标是从文本文件中获取一些信息,向用户显示该信息并询问值以替换该信息以生成新输出。所以我想到了使用正则表达式。

我的变量格式为:{@<num>[|<value>]}

以下是一些例子:

{@1}<br>
{@2|label}<br>
{@3|label|help}<br>
{@4|label|help|something else}<br><br>

经过一些研究和实验,我想出了这个表达式:\{\@(\d{1,})(?:\|{1}(.+))*\}

在大多数情况下效果都很好,除非是在这样的事情上:

{@1} some text {@2|label} some more text {@3|label|help}

在这种情况下变量2&amp; 3个匹配在一次出现而不是在2个单独的匹配...

我已经尝试使用lookahead命令来跟踪表达式的},但我没有设法得到它。

我将这个表达式用于使用C#,如果能进一步帮助任何人......

3 个答案:

答案 0 :(得分:1)

我喜欢这个结果:

\{\@(\d+)(?:|\|(.+?))\}

返回3组。第二组是数字(1,2,3),第三组是参数('label','label | help')。

我更倾向于删除*以支持|,以便捕获最后一个分组中第一个管道之后的所有参数。

答案 1 :(得分:0)

试试这个:

\{\@(\d+)(?:\|[^|}]+)*\}

在C#中:

MatchCollection matches = Regex.Matches(mystring,
                                        @"\{\@(\d+)(?:\|[^|}]+)*\}");

它会阻止标签和帮助进食|}

match[0].Value => {@1}
match[0].Groups[0].Value => {@1}
match[0].Groups[1].Value => 1
match[1].Value => {@2|label}
match[1].Groups[0].Value => {@2|label}
match[1].Groups[1].Value => 2
match[2].Value => {@3|label|help}
match[2].Groups[0].Value => {@3|label|help}
match[2].Groups[1].Value => 3

答案 2 :(得分:0)

可以使用的正则表达式类似于

\{\@(\d+)(?:\|([^|}]+))*\}

这样可以防止阅读任何结尾}

另一种可能的解决方案(行为稍有不同)是使用非贪婪的匹配器(.+?)而不是贪婪的版本(.+)

注意:我还删除了{1},并将{1,}替换为+,这与您的情况相同。