连续重复词的正则expression式

我是一个正则expression式新手,我不能完全弄清楚如何编写一个单一的正则expression式来“匹配”任何重复的连续单词,如:

巴黎在spring。

不是那个关系。

你笑什么? 我的正则expression式是不是很糟糕?

是否有一个正则expression式可以匹配上面的所有粗体string?

提前致谢!

试试这个正则expression式:

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

这里\b是一个单词边界, \1引用第一个组的捕获匹配。

我相信这个正则expression式处理更多的情况:

 /(\b\S+\b)\s+\b\1\b/i 

testingstring的好select可以在这里find: http : //callumacrae.github.com/regex-tuesday/challenge1.html

广泛使用的PCRE库可以处理这种情况(尽pipe如此,您将不会达到与POSIX兼容的正则expression式相同的效果):

 (\b\w+\b)\W+\1 

不,那是一个不规则的语法。 可以使用特定于引擎/语言的正则expression式,但是没有通用的正则expression式可以实现。

尝试下面的RE

  • \ b单词边界的开始
  • \ W +任何单词的字符
  • \ 1相同的单词已经匹配
  • \ b字的结尾
  • ()*再次重复

     public static void main(String[] args) { String regex = "\\b(\\w+)(\\b\\W+\\b\\1\\b)*";// "/* Write a RegEx matching repeated words here. */"; Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE/* Insert the correct Pattern flag here.*/); Scanner in = new Scanner(System.in); int numSentences = Integer.parseInt(in.nextLine()); while (numSentences-- > 0) { String input = in.nextLine(); Matcher m = p.matcher(input); // Check for subsequences of input that match the compiled pattern while (m.find()) { input = input.replaceAll(m.group(0),m.group(1)); } // Prints the modified sentence. System.out.println(input); } in.close(); } 

在Javascript中的例子:好的部分可以适应做到这一点:

 var doubled_words = /([A-Za-z\u00C0-\u1FFF\u2800-\uFFFD]+)\s+\1(?:\s|$)/gi; 

\ b将\ w用于单词边界,其中\ w等同于[0-9A-Z_a-z]。 如果你不介意这个限制,接受的答案是好的。

这是我用来删除我的抽搐机器人重复短语的正则expression式:

 (\S+\s*)\1{2,} 

(\S+\s*)查找任何不是空格的string,然后是空格。

\1{2,}然后在string中查找超过2个该短语的实例以匹配。 如果有3个相同的短语,则匹配。

这个expression式(从上面的Mike的启发)似乎捕获所有重复,重复等,包括在string的末尾,其他大多数不重复:

 /(^|\s+)(\S+)(($|\s+)\2)+/gi, "$1$2") 

我知道这个问题要求只匹配重复 ,但一式三份只是2个副本相邻:)

首先,我把(^|\s+)确定为一个完整的单词开始,否则“小孩的牛排”会变成“小孩的”(“s”将会匹配)。 然后,它匹配所有完整的单词( (\b\S+\b) ),接着是string的结尾( $ )或空格的数目( \s+ ),整个重复不止一次。

我尝试了这样,它运作良好:

 var s = "here here here here is ahi-ahi ahi-ahi ahi-ahi joe's joe's joe's joe's joe's the result result result"; print( s.replace( /(\b\S+\b)(($|\s+)\1)+/gi, "$1")) --> here is ahi-ahi joe's the result 
 ([a-zA-Z]+)\s+\1 

以下内容适用于字母串
在这里,1将捕获第一场比赛。 只需在[]内添加有效的正则expression式

如果您希望对重复单词进行不区分大小写检查,请使用此选项。

 (?i)\\b(\\w+)\\s+\\1\\b