Regex 正则表达式练习组

Regex 正则表达式练习组,regex,vb.net,Regex,Vb.net,你好,堆栈溢出。正如我在上一篇文章中提到的,我正在努力提高正则表达式的水平。今晚我将翻阅我的书中的章节,并决定看看是否可以,如果可能的话,创建多个组。我完全知道正则表达式并不是所有问题的答案,这纯粹是我要学习的。我正在使用VB.net 输入示例: 现在,这是一个由我自己完成的输出,用于测试。此表达式的一致性因素是Name{}始终存在仅由a-z开头组成的名称。在花括号内。分隔两个组的主要分隔符是,在组开始之前,将有一个可选的%@以可选的%结尾 因此,总结一下,我只想匹配仅a-z无限次的花括号中定义

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

输入示例:

现在,这是一个由我自己完成的输出,用于测试。此表达式的一致性因素是
Name{}
始终存在仅由
a-z
开头组成的名称。在花括号内。分隔两个组的主要分隔符是
在组开始之前,将有一个可选的
%@
以可选的
%
结尾

因此,总结一下,我只想匹配仅
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, ]+(?=%?})
(?模式
(\w+)
是否符合您的目的? 在这两个示例中,它都将匹配MyTokenName、example1和example2

如果您总是想忽略MyTokenName,您可以只引用列表中第一个匹配项以外的任何匹配项

比如:


类似的情况。

这种可变长度的查找在性能方面是昂贵的,在这种情况下没有真正的价值,而您只需要捕获您所感兴趣的内容

这可能有用


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

一个有趣的方法可能是:

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

/(?i)(?总是只有两个小组吗?只是我在练习,所以我要说是的,总是有两个小组。我现在觉得很没用,因为我学到的每一件事都不意味着什么。这都是学习的一部分!很好,你在挑战自己去应用你的知识。坚持下去!山姆,问题中的那四段是什么n?这个答案没有考虑到问题中所述的任何要求,它还将匹配
foobarlol
和许多其他字符串。@SamJohnson所以如果这是你要找的答案,你甚至不需要写那么长的问题来满足所有这些要求。哇,你真的考虑到了这一点。更重要的是y我现在知道了另外两个很棒的网站。我现在要尝试一下,但是有没有办法添加一个组来匹配MyTokenName呢?(?
)(?这实际上让我很困惑,如果我用几个新字符(->)替换%的话,它会失败(?-->?\s*(?:,\s*|])你不能使用长度可变的模式(
\s*
)在lookbehinds(
(?
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
/(?i)(?<=\{|\G|\{%@|\G%@)([a-z0-9]+)(?:%?\s*(?:,\s*|\}))/g