【问题标题】:Finding doubled-word(s) with Regular Expressions使用正则表达式查找双字
【发布时间】:2009-08-11 18:53:07
【问题描述】:

我想在文本中查找双字,我使用了(\w+) +\1 它可以工作,但它只能在文本中找到“abc abc”。

我也想找“abc def abc def”

谢谢,..

【问题讨论】:

  • 您使用的是哪个正则表达式?什么语言?
  • 你真的可以用常规语言做到这一点吗?似乎这与匹配括号一样不可能,这是传统正则表达式中另一个众所周知的不可能
  • 使用反向引用很有可能(尤其不是正式正则表达式的功能,而是大多数现代正则表达式引擎的功能)。
  • @gnarf:我在 PHP 上使用了它 @MSalters:正如@Dav 所说,它可能带有反向引用,我使用了 "\1" 顺便说一句,解决方案是 "(\w.*) +\1 "

标签: regex


【解决方案1】:

以下正则表达式将匹配任何重复的字符序列:

/(.+).*?\1/

如果您只想要中间只有空格的重复序列,请改用它:

/(.+)\s+?\1/

如果您只想用空格分隔单词,请将(.+) 更改为(\w+)

/(\w+)\s+?\1/

如果您想查看忽略标点等内容的单词,单词边框可能更有用:

/(\b\w+?\b)\.+?\b\1\b/

【讨论】:

  • .+?,所以我们不匹配 ie。 “维基百科”
  • 我认为他想要单词,这甚至可以匹配同一组字符中的两个空格。
  • 取决于提问者想要的行为,但我会将其添加为选项。
【解决方案2】:

不确定您希望它匹配什么,但它可以像更改它一样简单:

(\w+) +.*\1

.* 将匹配可能介于两者之间的任何额外字符。

这将匹配'abc def abc def'的'abc def abc'部分,如果你想匹配它全部更改为:

(\w+) +.*\1.*

【讨论】:

  • 感谢您的回答,但没有奏效。现在,我尝试了 "((\w| )+) +\1" 它有效!但它也会找到“”(超过 3 个空格)
【解决方案3】:

(\w.*) +\1”也许吧?还是这对您的需求来说太笼统了?

(\w+(?:\s+\w+)*) +\1”也可以。

【讨论】:

    【解决方案4】:

    你想delete the duplicates吗?或者你也可以查看这个answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 1970-01-01
      相关资源
      最近更新 更多