任何人都可以帮我这个吗?
我的目标是从文本文件中获取一些信息,向用户显示该信息并询问值以替换该信息以生成新输出。所以我想到了使用正则表达式。
我的变量格式为:{@<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#,如果能进一步帮助任何人......
答案 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,}
替换为+
,这与您的情况相同。