解释(\b\S+)(\1\b)+"在Java中检测连续重复单词

问题描述 投票:0回答:1

在删除连续重复的单词中,我们将采取

"alpha beta beta gamma gamma gamma delta alpha beta beta gamma gamma gamma delta"
作为输入字符串和输出。
"alpha beta gamma delta alpha beta gamma delta"
我看到的解决方案之一是。非常优雅,但我仍然在正则表达式中挣扎

public class Kata {
    public static String removeConsecutiveDuplicates(String s){
           return s.replaceAll("(\\b\\S+)( \\1\\b)+", "$1");
    }
}

\\b
表示单词边界。
\\s+
的意思。一个或多个空白处。
( \\1)
表示第一组即
(\\b\\S+) 
( \\1\\b)+
表示匹配第一组和重复的单词,对吗? 我确信
( \\1\\b)+
中的空白区域实际上是做什么的。 我什么都没尝试。

java regex
1个回答
0
投票
  • 如果单词之间有一个额外的空格,则该模式将失败。
  • 我会使用这种模式:
    ((?:\\b)\\S+\\b(?:\\s*))(?:\\s*\\1){1,}

代码

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Solution {
    public static void main(String[] args) {
        final String regex = "((?:\\b)\\S+\\b(?:\\s*))(?:\\s*\\1){1,}";
        final String string = "gamma gamma gamma   gamma alpha beta beta gamma gamma gamma delta alpha beta beta gamma gamma   gamma delta delta";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));

            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("Group " + i + ": " + matcher.group(i));
            }
        }
    }
}

打印

Full match: gamma gamma gamma   gamma 
Group 1: gamma 
Full match: beta beta 
Group 1: beta 
Full match: gamma gamma gamma 
Group 1: gamma 
Full match: beta beta 
Group 1: beta 
Full match: gamma gamma   gamma 
Group 1: gamma 
Full match: delta delta
Group 1: delta

© www.soinside.com 2019 - 2024. All rights reserved.