正则表达式练习组

时间:2013-11-05 20:35:57

标签: regex vb.net

再次问好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方法做​​到这一点。

3 个答案:

答案 0 :(得分:1)

这种可变长度的后视是昂贵的表现,并且在这种情况下没有实际价值,当你想要做的就是捕捉你所感兴趣的内容。

这可能有用。

[a-zA-z]+ { \s*(?:%@)? ([a-z]+) %?\s* , \s*(?:%@)? ([a-z]+) %?\s* }

答案 1 :(得分:1)

一种有趣的方式可能就是这个:

/(?i)(?<=\{|\G|\{%@|\G%@)([a-z0-9]+)(?:%?\s*(?:,\s*|\}))/g

http://regex101.com/r/bU0zY5

这里也是它的结构视图:

Regular expression visualization

Debuggex Demo

有趣我的意思是使用\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

类似的东西。