【问题标题】:Regex practicing groups正则表达式练习组
【发布时间】:2013-11-05 20:35:56
【问题描述】:

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

示例输入:

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

现在这是一个由我自己完成的输出以供测试。这个表达式的一致因子是Name{ } 总会有一个名字只由a-z 组成。大括号内。分隔两组的 MAIN 分隔符是 , 在组开始之前会有一个 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 方法做到这一点。

【问题讨论】:

  • 总是只有2组吗?
  • 嗯,这只是我在练习,所以我会说是的,总会有两组。

标签: regex vb.net


【解决方案1】:

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

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

http://regex101.com/r/bU0zY5

这也是它的结构视图:

Debuggex Demo

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

【讨论】:

  • 哇,你真的考虑到了。更重要的是,我现在知道另外两个很棒的网站。我现在要尝试,但有没有办法添加一个组也匹配 MyTokenName。
  • (?i)(?
  • (?&lt;=([a-z]+) ???我假设有问题。无法使用不固定长度的 Lookbehinds
  • 这实际上让我感到困惑,如果我用几个新字符替换 % (-->) 它会失败 (?:-->?\s*(?:,\s *|]))
  • 您不能在后视 ((?&lt;=.....)) 中使用可变长度的模式 (\s*),这可能是您的问题
【解决方案2】:

这种可变长度的后视在性能方面是昂贵的,在这种情况下没有真正的价值,因为你想做的只是捕捉你感兴趣的东西。

这可能有效。

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

【讨论】:

    【解决方案3】:

    (\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
    

    类似的东西。

    【讨论】:

    • 我现在觉得自己真的没用了,因为我学到的每件事都没有任何意义。
    • 这都是学习的一部分!你挑战自己以应用你的知识是很好的。继续加油!
    • 山姆,这 4 段的问题是什么?
    • 此答案未考虑问题中所述的任何要求,这也将匹配 foobarlol 和许多其他字符串。 @SamJohnson 因此,如果这是您正在寻找的答案,您甚至不需要写出包含所有这些要求的长问题。
    猜你喜欢
    • 2017-12-09
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 2021-07-15
    相关资源
    最近更新 更多