我是一个正则表达式新手,我还不太清楚如何编写一个可以与任何重复的连续单词“匹配”的正则表达式,例如:
在巴黎的的春天。
并不是说这有关。
你笑什么?是我的我的正则表达式不好?
是否有一个单个正则表达式将与上面的所有粗体字符串匹配?
not that that is related
-> not that is related
)?在此先感谢
\1
!
\b(\w+)\s+(\1\s*)+\b
?
我是一个正则表达式新手,我还不太清楚如何编写一个可以与任何重复的连续单词“匹配”的正则表达式,例如:
在巴黎的的春天。
并不是说这有关。
你笑什么?是我的我的正则表达式不好?
是否有一个单个正则表达式将与上面的所有粗体字符串匹配?
not that that is related
-> not that is related
)?在此先感谢
\1
!
\b(\w+)\s+(\1\s*)+\b
?
Answers:
试试这个正则表达式:
\b(\w+)\s+\1\b
这\b
是单词边界,它\1
引用的是第一组捕获的匹配项。
\0
吗?(哪里\0
是整个正则表达式,直到当前点,还是\0
指整个正则表达式)
我相信此正则表达式可以处理更多情况:
/(\b\S+\b)\s+\b\1\b/
可以在这里找到测试字符串的很好选择:http : //callumacrae.github.com/regex-tuesday/challenge1.html
<strong>\0</strong>
但不起作用。
$1 <strong>$2</strong>
。还要使用不同的正则表达式/\b(\S+) (\1)\b/gi
。这是链接:callumacrae.github.io/regex-tuesday/…–
<p class="bebe">bla bla</p>
如何集成此正则表达式公式?
尝试以下RE
()*再次重复
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();
}
广泛使用的PCRE库可以处理这种情况(你不会达到的了与POSIX兼容的正则表达式引擎一样,虽然):
(\b\w+\b)\W+\1
\W+
。 \b
不会这样做,因为它不会消耗任何字符。
... the these problems...
。该解决方案不如足以实现单词边界的Gumbo模式的一般结构可靠。
<p class="bebe">bla bla</p>
如何集成此正则表达式公式?
这是我用来删除twitch机器人中重复短语的正则表达式:
(\S+\s*)\1{2,}
(\S+\s*)
查找不是空格的任何字符串,后跟空格。
\1{2,}
然后在字符串中查找该短语的两个以上实例以进行匹配。如果有3个相同的词组,则匹配。
\s*
捕获组中的,它也不是很健壮。观看此演示:regex101.com/r/JtCdd6/1
I said "oioioi" that's some wicked mistressship!
在oioioi
和sss
下面的表达式应该可以正常工作以查找任意数量的连续单词。匹配可以不区分大小写。
String regex = "\\b(\\w+)(\\s+\\1\\b)*";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
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));
}
输入样本:再见再见GooDbYe
样本输出:再见
说明:
正则表达式:
\ b:单词边界的开始
\ w +:任意数量的单词字符
(\ s + \ 1 \ b)*:任意数量的空格,后跟与前一个单词匹配并结束单词边界的单词。用*包裹的整个内容有助于找到多个重复项。
分组:
m.group(0):在上述情况下将包含匹配的组再见再见GooDbYe
m.group(1):在上述情况下,再包含匹配模式的第一个单词再见
替换方法应将所有连续匹配的单词替换为单词的第一个实例。
不,那是不规则的语法。您可能会使用特定于引擎/语言的正则表达式,但是没有通用的正则表达式可以做到这一点。
这是一个可以多次捕获多个单词的单词:
(\b\w+\b)(\s+\1)+
<p class="bebe">bla bla</p>
如何集成此正则表达式公式?
<p class="bebe">.*?\b\s+(\w+)\b\K\s+\1\s+\b(?=.*?<\/p>)
尝试使用此正则表达式,它可以捕获2个或更多重复的单词,并且仅留下一个单词。并且重复的单词甚至不必是连续的。
/\b(\w+)\b(?=.*?\b\1\b)/ig
在此,\b
用于词边界,?=
用于正向超前,并\1
用于向后引用。
"the cat sat on the mat"
->" cat sat on the mat"
由于一些开发人员正在此页面上寻找一种解决方案,该解决方案不仅消除了重复的连续非空白子字符串,而且消除了三重复以及以后的内容,因此,我将展示适应的模式。
图案:/(\b\S+)(?:\s+\1\b)+/
(图形演示)
替换:$1
(与捕获组#替换fullstring匹配1)
此模式贪婪地匹配“整个”非空白子字符串,然后需要一个或多个匹配子字符串的副本,这些副本可以由一个或多个空白字符(空格,制表符,换行符等)分隔。
特别:
\b
(单词边界)字符对于确保部分单词不匹配至关重要。+
非捕获组上的(一个或多个量词)比*
因为*
“阻止”正则表达式引擎捕获和替换单例事件更合适-这是浪费的模式设计。*请注意,如果您要处理带有标点符号的句子或输入字符串,则需要进一步完善模式。
这个表达式(从上面的Mike那里得到启发)似乎捕获了所有重复项,三重复项等,包括字符串末尾的重复项,而大多数其他字符串却没有:
/(^|\s+)(\S+)(($|\s+)\2)+/g, "$1$2")
我知道这个问题要匹配重复项,但是一式三份只是彼此相邻的两个重复项:)
首先,我(^|\s+)
确保它以一个完整的单词开头,否则“儿童牛排”将变为“儿童牛排”(“ 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
\b
在结尾处做了些微调整,如下所示:/(^|\s+)(\S+)(($|\s+)\2)+\b/g, "$1$2")
这将适用于以下情况:the the string String string stringing the the along the the string
将变为the string stringing the along the string
Notice string stringing
。它与您的答案相匹配。谢谢。
如果要对重复的单词进行不区分大小写的检查,请使用此选项。
(?i)\\b(\\w+)\\s+\\1\\b