广泛使用的PCRE库可以处理这种情况(尽管如此,您将无法实现 the the 与POSIX兼容的正则表达式引擎):
(\b\w+\b)\W+\1
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();
}
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
12 回答
这是我用来删除twitch bot中重复短语的正则表达式:
(\S+\s*)
查找不是空格的任何字符串,后跟空格 .\1{2,}
然后在要匹配的字符串中查找该短语的2个以上实例 . 如果有3个相同的短语,则匹配 .试试这个正则表达式:
这里
\b
是一个单词边界,\1
引用第一组的捕获匹配 .我相信这个正则表达式处理更多情况:
可以在这里找到很多测试字符串:http://callumacrae.github.com/regex-tuesday/challenge1.html
广泛使用的PCRE库可以处理这种情况(尽管如此,您将无法实现 the the 与POSIX兼容的正则表达式引擎):
尝试使用以下RE
\ b单词边界的开头
\ W任何单词字符
\ 1已经匹配了相同的单词
\ b结尾
()*再次重复
不,那是不规则的语法 . 您可以使用特定于引擎/语言的正则表达式,但是没有可以执行此操作的通用正则表达式 .
Javascript:Good Parts中的示例可以适用于:
\ b使用\ w作为字边界,其中\ w等效于[0-9A-Z_a-z] . 如果你不介意这个限制,接受的答案是好的 .
这个表达式(灵感来自迈克,上面)似乎捕获了所有重复,三次重复等,包括字符串末尾的那些,其他大多数都没有:
我知道要求匹配重复的问题,但一式三份只是彼此相邻的2个重复:)
首先,我把
(^|\s+)
确定它以一个完整的单词开头,否则"child's steak"将转到"child'steak"("s"的匹配) . 然后,它匹配所有完整单词((\b\S+\b)
),后跟一个字符串结尾($
)或多个空格(\s+
),整个重复不止一次 .我尝试过这样,效果很好:
由于一些开发人员来到这个页面寻找一个解决方案,不仅消除了重复的连续非空白子串,而且重复三次以上,我将展示适应的模式 .
型号:
/(\b\S+)(?:\s+\1\b)+/
(Pattern Demo)替换:
$1
(用捕获组#1替换全字符串匹配)此模式贪婪地匹配“整个”非空白子字符串,然后需要匹配子字符串的一个或多个副本,这些副本可以由一个或多个空白字符(空格,制表符,换行符等)分隔 .
特别:
\b
(字边界)字符对于确保部分单词不匹配至关重要 .第二个括号是非捕获组,因为不需要捕获此可变宽度子串 - 仅匹配/吸收 .
非捕获组上的
+
(一个或多个量词)比*
更合适,因为*
将使用正则表达式引擎来捕获和替换单例出现 - 这是浪费的模式设计 .*请注意,如果您使用标点符号处理句子或输入字符串,则需要进一步细化模式 .
这是多次捕获多个单词的一个:
如果您希望不区分大小写检查重复单词,请使用此选项 .
正则表达式删除2个重复单词(连续/非连续单词)
尝试这个可以捕获2个或更多重复单词的正则表达式,只留下一个单词 . 和重复的单词 need not even be consecutive .
这里,
\b
用于字边界,?=
用于正向前导,\1
用于反向引用 .Example Source