1

你好,堆栈溢出。正如我在上一篇文章中提到的,我正在努力提高正则表达式的水平。我今晚正在阅读我的书籍章节,并决定看看我是否可以,如果可能的话,创建多个组。我完全意识到 Regex 并不是所有这一切的答案,这纯粹是为了让我学习。我正在使用 VB.net

示例输入:

MyTokenName{%@example1%, %@example2%}
MyTokenName{example1, example2}

现在这是一个由我自己完成的输出来测试。这个表达式的一致因素是Name{ }总会有一个只由a-z第一个组成的名称。大括号内。分隔两个组的主要分隔符是,在组开始之前会有一个以 OPTIONAL%@结尾的 OPTIONAL%

所以总而言之,我只想匹配在大括号之间定义的组,只有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 方法做到这一点。

4

3 回答 3

1

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

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

http://regex101.com/r/bU0zY5

这也是它的结构视图:

正则表达式可视化

调试演示

有趣的是我的意思是使用lookbehind with \G;) 它应该匹配你所有的examples

于 2013-11-05T21:22:02.777 回答
1

这种可变长度的lookbehind在性能方面是昂贵的,在这种情况下没有真正的价值,当你想要做的就是捕捉你感兴趣的东西时。

这可能会奏效。

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

于 2013-11-05T21:05:57.880 回答
0

Does the pattern (\w+) serve your purpose here? It'll match MyTokenName, example1, and example2 in both sample cases.

If you always wanted to ignore MyTokenName you could just refer to any matches other than the first match in the list.

Like:

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

Something like that.

于 2013-11-05T20:55:17.233 回答