【问题标题】:Match all words expect non duplicates匹配所有单词期望不重复
【发布时间】:2016-04-17 20:07:02
【问题描述】:
Hello Foo Bar World Foo World Bar Test Foo
foo bar

我希望我的正则表达式匹配除非重复单词之外的所有内容:

它应该匹配测试字符串中的以下所有单词:Foo Bar World
它不应该匹配:Hello Test,因为它们不重复。

我怎样才能做到这一点?

【问题讨论】:

  • 这不是正则表达式的好任务。你可能有the XY problem。如果您在不关注正则表达式的情况下解释您想要做什么以及您尝试过什么,您将获得更好的答案。
  • 你可以写“一个理论模式”来找到这些单词,但问题是使用这种模式的算法的复杂度会随着文本大小(要查找的单词数量)呈指数增长准确无误)。因此,您无法使用这些模式解决此类问题。一种更简单的方法是将文本拆分为单独的单词(或匹配每个单词)并计算第二次出现的次数(如果可能,最好的方法是使用迭代器并使用单词递增哈希为键)。
  • 我明白了,我只是好奇这是否可以用正则表达式解决。我已经有其他方法来解决它谢谢:D
  • 你可以这样写:regex101.com/r/kC8mC8/1(看看需要的步骤数,复制主题行几次看看会发生什么)
  • @CasimiretHippolyte Holy **** 步数急剧增加。

标签: pcre


【解决方案1】:

您可以使用积极的前瞻性断言。它不是特别有效,我不会使用正则表达式来完成任务。

/(\b\w++\b)(?=(?>.*?\1(?:.(?!\1))*)$)/gs

编辑:错过Casimir et Hippolyte的评论答案,速度更快但兼容性较差。

【讨论】:

    猜你喜欢
    • 2019-11-18
    • 2015-06-22
    • 2016-02-17
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多