Home Articles

连续重复词的正则表达式

Asked
Viewed 765 times
91

我是一个正则表达式新手,我无法弄清楚如何编写一个能够“匹配”任何重复连续单词的正则表达式,例如:

巴黎 Spring 天 . 并非那是相关的 . 你笑什么?我的正则表达式是不是很糟糕?

是否有一个正则表达式将匹配上面的所有粗体字符串?

12 Answers

  • 105

    正则表达式删除2个重复单词(连续/非连续单词)

    尝试这个可以捕获2个或更多重复单词的正则表达式,只留下一个单词 . 和重复的单词 need not even be consecutive .

    /\b(\w+)\b(?=.*?\b\1\b)/ig
    

    这里, \b 用于字边界, ?= 用于正向前导, \1 用于反向引用 .

    Example Source

  • 18

    广泛使用的PCRE库可以处理这种情况(尽管如此,您将无法实现 the the 与POSIX兼容的正则表达式引擎):

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

    这个表达式(灵感来自迈克,上面)似乎捕获了所有重复,三次重复等,包括字符串末尾的那些,其他大多数都没有:

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

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

    首先,我把 (^|\s+) 确定它以一个完整的单词开头,否则"child's steak"将转到"child'steak"("s"的匹配) . 然后,它匹配所有完整单词( (\b\S+\b) ),后跟一个字符串结尾( $ )或多个空格( \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)+/g, "$1"))         
    --> here is ahi-ahi joe's the result
    
  • 4

    这是多次捕获多个单词的一个:

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

    试试这个正则表达式:

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

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

  • 2

    这是我用来删除twitch bot中重复短语的正则表达式:

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

    (\S+\s*) 查找不是空格的任何字符串,后跟空格 .

    \1{2,} 然后在要匹配的字符串中查找该短语的2个以上实例 . 如果有3个相同的短语,则匹配 .

  • 2

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

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

    我相信这个正则表达式处理更多情况:

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

    可以在这里找到很多测试字符串:http://callumacrae.github.com/regex-tuesday/challenge1.html

  • 1

    尝试使用以下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();
    }
    
  • 1

    不,那是不规则的语法 . 您可以使用特定于引擎/语言的正则表达式,但是没有可以执行此操作的通用正则表达式 .

  • 0

    由于一些开发人员来到这个页面寻找一个解决方案,不仅消除了重复的连续非空白子串,而且重复三次以上,我将展示适应的模式 .

    型号: /(\b\S+)(?:\s+\1\b)+/Pattern Demo
    替换: $1 (用捕获组#1替换全字符串匹配)

    此模式贪婪地匹配“整个”非空白子字符串,然后需要匹配子字符串的一个或多个副本,这些副本可以由一个或多个空白字符(空格,制表符,换行符等)分隔 .

    特别:

    • \b (字边界)字符对于确保部分单词不匹配至关重要 .

    • 第二个括号是非捕获组,因为不需要捕获此可变宽度子串 - 仅匹配/吸收 .

    • 非捕获组上的 + (一个或多个量词)比 * 更合适,因为 * 将使用正则表达式引擎来捕获和替换单例出现 - 这是浪费的模式设计 .

    *请注意,如果您使用标点符号处理句子或输入字符串,则需要进一步细化模式 .

  • -1

    Javascript:Good Parts中的示例可以适用于:

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

    \ b使用\ w作为字边界,其中\ w等效于[0-9A-Z_a-z] . 如果你不介意这个限制,接受的答案是好的 .

Related