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