【问题标题】:Regex repeated words on the same line正则表达式在同一行重复单词
【发布时间】:2013-05-02 08:39:11
【问题描述】:

查找在同一行重复的单词的正则表达式是什么?

我尝试了一些在 StackOverflow 上找到的表达式,例如 this,但没有一个能正常工作。

我想要达到的结果:

【问题讨论】:

  • 一些示例输入和输出会有所帮助。什么是“词”?您以前的尝试有什么不适用的?您使用的是哪种编程语言/工具/环境(即哪种正则表达式)?
  • 什么是“词”?任何单词。您以前的尝试有什么不适用的?你在我的问题的链接中有一个例子。您使用的是哪种编程语言/工具/环境(即哪种正则表达式)?任何文本编辑器,例如 Sublimetext、notepad++、...
  • 我看不到链接问题中的问题。 “任何词”并没有真正的帮助。只有字母吗?还是单词的正则表达式定义? (字母、数字、下划线)。 don't 是一个词吗?仅仅因为您链接了提供输入/输出示例的问题并不能使您自己的问题更加完整。如果我们有您的一些实际示例输入,那将非常有帮助。还有“在同一行重复的单词” - 必须是连续的(如链接问题中所示)?或者你想在foo bar foo 中找到foo?对我来说,这在同一行重复。
  • 正则表达式(引擎)存在变化。该示例位于Perl。目标环境是什么?珀尔? JavaScript?还有什么?

标签: regex


【解决方案1】:

这个正则表达式会找到你想要突出显示的单词。 (示例是用 JavaScript 编写的,很容易在浏览器的 JavaScript 控制台中测试。)

s = "It's a foo and a bar and a bar and a foo too.";
a = s.match(/\b(\w+)\b(?=.*\b\1\b)/g);

这会返回一个单词数组,对于同一个单词可能会多次返回。

接下来你可以这样做:

re = new RegExp('\\b(' + a.join('|') + ')\\b', 'g');

这足以突出所有出现的情况:

out = s.replace(re, function(m) { return '<b>' + m + '</b>' });

【讨论】:

    【解决方案2】:

    例如,如果您想查找多个单词,例如,

    山姆went wentto to to他的生意

    你可以使用这个正则表达式:

    s = "Sam went went to to to his business";
    a = s.match(/\b(\w+)(\s\1)+\b/g);
    

    【讨论】:

    • 什么编程语言? JavaScript?或者是其他东西?请通过editing (changing) your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。
    【解决方案3】:

    在没有示例字符串的情况下,让我们使用一个测试用例和几个示例来说明如何实现这一点。

    字符串

    我叫詹姆斯,詹姆斯是我的名字

    正则表达式

    ^(詹姆斯)$

    第 1 组(0 通常是完整匹配字符串,可能没有捕获计数)被捕获两次。这意味着这个词被重复了。您用于执行正则表达式的工具中需要一些逻辑,以确定您是否对“单词”感兴趣。

    使用相同的字符串,考虑这个正则表达式

    (?<=James.*)(James)
    

    仅当单词 James 以 'James' 后跟任何字符时才会检测到该单词。根据您的引擎,“。” (句点) 默认情况下应该匹配 换行符的任何字符。这将搜索限制在一行。

    请注意必须准确指定单词的限制。我不知道如何解决这个问题。

    编辑 试试这个,太棒了..

    (?

    使用正向后视(如示例 2)我们检测与当前组匹配的“整个单词”。一个完整的词定义为:

    • 我们现在的话
    • 至少有 1 个空格字符或行首
    • 后跟至少 1 个空格

    此外,我们所在的匹配项必须是一个独立的单词(前面至少有一个空格字符)。

    就结果而言,每次匹配都会是一个重复的单词。

    【讨论】:

      【解决方案4】:

      您可以使用此正则表达式查找相邻的连续单词。

      例如:"My name is Prince Prince, and I love cats." 下面的正则表达式将找到Prince Prince。它最简单的版本。

      (\w+)(\s\1)+

      【讨论】:

      • 请解释这将做什么。它有助于使您的答案对社区更有价值。
      • 我很欣赏编辑;但这仍然不能真正解释 RegEx 在做什么。更不用说它实际上并没有回答这个问题。此正则表达式在以下句子上失败:My name is Prince Prince, and I love Prince cats. 应该匹配 Prince 三次 - 问题要求同一行,而不是连续的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 2016-03-17
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多