再次问好Stack Overflow。正如我在上一篇文章中提到的,我正试图在正则表达式上做得更好。今晚我将阅读我的书籍章节,并决定是否可以,如果可能的话,创建多个小组。我完全清楚正则表达式并不能解决所有纯粹为我学习的问题。我正在使用VB.net
示例输入:
MyTokenName{%@example1%, %@example2%}
MyTokenName{example1, example2}
现在这是一个由我自己输出完成的测试。此表达式的一致因素为Name{ }
。名称始终只包含a-z
。在大括号里面。分隔两组的MAIN分隔符是,
在组开始之前,将有一个以可选%@
%
总而言之,我只希望匹配仅在a-z
无限次大括号之间定义的组。
MyTokenName{%@example%, %@example%} ----- Would match Two groups example1 and example2
MyTokenName{example, example} --- Would match Two groups example1 and example2
我的尝试不起作用。
(?<=[a-zA-Z]+\{[^a-zA-Z@]+?)[a-zA-Z, ]+(?=%?})
任何建议都会很棒。谢谢你们这么棒的论坛。请记住我只是想练习正则表达式。我可以用其他.Net方法做到这一点。
答案 0 :(得分:1)
这种可变长度的后视是昂贵的表现,并且在这种情况下没有实际价值,当你想要做的就是捕捉你所感兴趣的内容。
这可能有用。
[a-zA-z]+ { \s*(?:%@)? ([a-z]+) %?\s* , \s*(?:%@)? ([a-z]+) %?\s* }
答案 1 :(得分:1)
一种有趣的方式可能就是这个:
/(?i)(?<=\{|\G|\{%@|\G%@)([a-z0-9]+)(?:%?\s*(?:,\s*|\}))/g
这里也是它的结构视图:
有趣我的意思是使用\G
;)的lookbehind,它应该与你的所有example
匹配
答案 2 :(得分:0)
模式(\w+)
是否符合您的目的?
在两个示例中,它都匹配MyTokenName,example1和example2。
如果你一直想忽略MyTokenName,你可以引用除列表中第一场比赛以外的任何比赛。
像:
dim txt = "MyTokenName{%@example1%, %@example2%}"
dim matches = regex.matches(txt,"(\w+)")
for i as integer = 1 to (matches.count - 1)
DoSomethingWith(matches(i).value) 'start at 1 so we skip over MyTokenName
next
类似的东西。