【问题标题】:Positive look a heads - Duplicate wording正面的样子 - 重复的措辞
【发布时间】:2014-05-07 21:21:00
【问题描述】:

我只是在练习我的正则表达式,所以没有真正的“问题”。我不想建议其他 NET 方法可以做到这一点。这都是关于我学习的,所以如果它与正则表达式无关,请不要回答。谢谢。

我给自己一个匹配重复单词的任务。我对单词进行了硬编码,但问我自己如果我们想要所有单词怎么办。我试图做的是将第一个单词的第一个引用返回到第一组,然后从那里开始。整晚都在挣扎。

Word 文本格式的示例是“The quick Brown Fox Jump over the Brown fence”。正如我们所见,The 和 Brown 重复了两次。

表达式:

(?i)(?<=\s*\1\.*)\s+(\w+)

任何我出错的提示或建议都很棒。我得到了正则表达式好友的启动,但仍在挣扎。我正在使用 VB.Net

【问题讨论】:

    标签: regex vb.net


    【解决方案1】:

    您在代码中使用的不是“积极向前看”,而是“向后看”。

    我没有使用 vb.net 的经验。但并非所有的正则表达式引擎都支持动态长度(如.*

    但是您的问题可以通过积极的前瞻来解决:

    (\b\w+\b)(?=.*?\1)
    

    我没有 Windows,请尝试使用 grep 的 -P (PCRE) 和 -i (忽略大小写) 选项:

    kent$ echo "The quick Brown Fox Jump over the Brown fence."|grep -iPo '(\b\w+\b)(?=.*?\1)'  
    The
    Brown
    

    【讨论】:

    • +1 表示答案和 "kent@World$ man life No manual entry for life" ;)
    【解决方案2】:

    你所拥有的实际上是一个后视,而不是一个前瞻。您的方法可能仍然有效,但是,在 .NET 中,反向引用 (\1) 需要他们引用的组之后。它还有助于使用单词边界 (\b) 而不是测试单词字符周围的空格 (\s)。

    乍一看,您似乎可以通过将捕获组放在后视中来解决这个问题:

    (?i)(?<=\b(\w+)\b.*)\1
    

    虽然由于后视中的贪婪.*,第一组将只匹配字符串中的第一个单词(The)。所以这实际上等同于(?i)\b(\w+)\b.*\1。使其非贪婪 (.*?) 将导致它仅匹配同一单词的两个连续实例。

    那么解决方案就是像这样简单地使用前瞻:

    (?i)\b(\w+)\b(?=.*\1)
    

    为了以防万一您出于任何原因需要获取第二个单词而不是第一个单词,这可以通过简单地将第二个捕获组放入前瞻中来完成

    进一步阅读

    【讨论】:

    • 完全披露:I asked a question 不久前关于这个话题,但我不觉得这个问题是重复的,因为它似乎在问一个更普遍的问题。
    猜你喜欢
    • 2019-11-02
    • 1970-01-01
    • 2021-12-12
    • 2020-04-23
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    相关资源
    最近更新 更多