【问题标题】:Match an arbitrary sequence that is repeated twice in a string匹配在字符串中重复两次的任意序列
【发布时间】:2015-04-07 17:38:40
【问题描述】:

我有一个名字列表。名称可能有一个、两个或多个部分。例如:

  • 雪儿
  • 汉弗莱·鲍嘉
  • 埃德加·艾伦·坡

我的输入供应之一是给我输入名字,名字重复两次,中间有一个空格。

  • 雪儿雪儿
  • 汉弗莱·鲍嘉汉弗莱·鲍嘉
  • 埃德加·艾伦·坡埃德加·艾伦·坡

是否有一个正则表达式可以用来查找重复的行?并得到它给我的名字(不重复)。

【问题讨论】:

    标签: regex


    【解决方案1】:

    Live demo

    简短:

    ([a-zA-Z ]+) (\1)
    

    【讨论】:

    • 我需要将此应用于地址,因此我使用([\w\. ]+) (\1) 来允许数字和句点。在 C# 中工作得很好。
    • 对于abc cba,它会在c c 找到匹配项。因此它适用于示例,因为它们以大写字母开头并以小写字母结尾,但对于全小写的单词可能会误报。
    【解决方案2】:
    ^(.*?)(?=\s\1)
    

    试试这个。查看演示。

    https://regex101.com/r/sJ9gM7/71

    【讨论】:

    • 感谢正则表达式的链接。我正在将它添加到我的工具箱中。
    【解决方案3】:

    您可以使用此正则表达式查找至少包含一个重复单词的所有名称:

    (.+)\h+(?=\1)
    

    RegEx Demo

    【讨论】:

    • 如果您删除尾随 .*$ 它适用于给定的示例。否则它只适用于“雪儿”的情况。见regex101.com/r/xR0rW6/1
    • 它工作正常。您需要g(全局)和m(多行)标志。 See this demo
    • 它仍然需要删除主表达式末尾的 .*$。使用 .*$ 第二行匹配“Humphry”,而不是“Humphry Bogart”。当 .* 被删除时,表达式会匹配我正在寻找的内容。
    • 第二行匹配,因为Humphry 出现了两次。如果您在第二行插入foo bar baz then it won't match 不确定哪里有混淆。
    • 最后一个是我正在寻找的结果。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 2016-01-23
    • 2010-12-24
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多