Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中搜索重复单词的正则表达式_Java_Regex - Fatal编程技术网

java中搜索重复单词的正则表达式

java中搜索重复单词的正则表达式,java,regex,Java,Regex,我想从给定的字符串中找到重复的单词。 我想要一个正则表达式来查找单词的每一次出现。 例如“我想吃苹果。苹果是一种水果” 正则表达式应该找到word“apple”这适用于多次重复和多行: Pattern p = Pattern.compile("\\b(\\w+)\\b(?=.*\\b(\\1)\\b)", Pattern.DOTALL); String s = "I want to eat apple. apple is a fruit.\r\n I really want f

我想从给定的字符串中找到重复的单词。 我想要一个正则表达式来查找单词的每一次出现。 例如
“我想吃苹果。苹果是一种水果”


正则表达式应该找到word
“apple”

这适用于多次重复和多行:

    Pattern p = Pattern.compile("\\b(\\w+)\\b(?=.*\\b(\\1)\\b)", Pattern.DOTALL);

    String s = "I want to eat apple. apple is a fruit.\r\n I really want fruit.";
    Matcher m = p.matcher(s);
    while (m.find()) {
        System.out.println("at: " + m.start(1) + " " + m.group(1));
        System.out.println("    " + m.start(2) + " " + m.group(2));
    }
它输出:

at: 0 I
    41 I
at: 2 want
    50 want
at: 14 apple
    21 apple
at: 32 fruit
    55 fruit

您可以使用以下命令来匹配一行中的所有重复单词

(\\b\\w+\\b)(?=.*\\b\\1\\b)        // matches duplicates only in a single line
编辑:如果要在多行中匹配重复项,可以使用:

(\\b\\w+\\b)(?=[\\s\\S]*\\b\\1\\b)  // or the above regex with DOTALL flag

请参见和

此方法去除任何非字母数字或空白的内容,在空白处分割,并创建结果的映射

Stream.of("I? want.... to eat apple    eat apple.      apple, is! a fruit".split("[^\\p{L}\\p{N}]+"))
      .collect(Collectors.groupingBy(s -> s))
结果:

a=[a], apple=[apple, apple, apple], fruit=[fruit], want=[want], eat=[eat, eat], I=[I], is=[is], to=[to]

那么你有没有尝试过任何方法来解决你的问题?为什么你想使用正则表达式?正则表达式不是正确的方法。使用
String#split()
,然后将字符串添加到
集合
。要清楚,使用正则表达式解决这个问题在理论上是可能的,但在实践中,随着字符串长度的增加,复杂性会变得太高太快。因此,一种可能的方法是在字符串中存储数据结构中每个不同单词的位置。您的正则表达式将在重复项之间使用文本,这将阻止重复使用它来查找其他重复项,如
eat apple eat apple
它不会复杂得多。你所需要做的就是防止消费,这可以通过前瞻机制来完成。@Pshemo:即使有前瞻,这种模式也会崩溃(或花费太多时间),只需要几行文字。@CasimiretHippolyte是的,我也不喜欢正则表达式(因为它的低效率,比如这一次的贪婪,以及错误,比如缺少对
匹配行分隔符的支持),但是由于OP要求使用正则表达式,所以让他使用它(每个人都有权犯自己的错误)。我希望OP能测试一下这种方法,并找出被否决的评论被否决是有原因的。@Pshemo:我感谢你的支持。我已经尝试过写一段java代码……我想尝试一下regex……因为我不是regex的专家……寻求帮助……这是我的代码……它不是做而不是收集在搜索单词本身时(这不是很有趣),您应该在字符串中收集这些单词的索引。还要注意的是,您应该使用例如
[\\p{L}\\p{N}]来搜索字符串,而不是替换特殊字符并用空格分隔+
。已更新拆分正则表达式。@SteveChaloner:我无法解析流和收集器。@AbhijitBashetti它们来自Java 8