连续重复词的正则expression式
我是一个正则expression式新手,我不能完全弄清楚如何编写一个单一的正则expression式来“匹配”任何重复的连续单词,如:
巴黎在spring。
不是那个关系。
你笑什么? 我的正则expression式是不是很糟糕?
是否有一个正则expression式可以匹配上面的所有粗体string?
提前致谢!
试试这个正则expression式:
\b(\w+)\s+\1\b
这里\b
是一个单词边界, \1
引用第一个组的捕获匹配。
我相信这个正则expression式处理更多的情况:
/(\b\S+\b)\s+\b\1\b/i
testingstring的好select可以在这里find: http : //callumacrae.github.com/regex-tuesday/challenge1.html
广泛使用的PCRE库可以处理这种情况(尽pipe如此,您将不会达到与POSIX兼容的正则expression式相同的效果):
(\b\w+\b)\W+\1
不,那是一个不规则的语法。 可以使用特定于引擎/语言的正则expression式,但是没有通用的正则expression式可以实现。
尝试下面的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(); }
在Javascript中的例子:好的部分可以适应做到这一点:
var doubled_words = /([A-Za-z\u00C0-\u1FFF\u2800-\uFFFD]+)\s+\1(?:\s|$)/gi;
\ b将\ w用于单词边界,其中\ w等同于[0-9A-Z_a-z]。 如果你不介意这个限制,接受的答案是好的。
这是我用来删除我的抽搐机器人重复短语的正则expression式:
(\S+\s*)\1{2,}
(\S+\s*)
查找任何不是空格的string,然后是空格。
\1{2,}
然后在string中查找超过2个该短语的实例以匹配。 如果有3个相同的短语,则匹配。
这个expression式(从上面的Mike的启发)似乎捕获所有重复,重复等,包括在string的末尾,其他大多数不重复:
/(^|\s+)(\S+)(($|\s+)\2)+/gi, "$1$2")
我知道这个问题要求只匹配重复 ,但一式三份只是2个副本相邻:)
首先,我把(^|\s+)
确定为一个完整的单词开始,否则“小孩的牛排”会变成“小孩的”(“s”将会匹配)。 然后,它匹配所有完整的单词( (\b\S+\b)
),接着是string的结尾( $
)或空格的数目( \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)+/gi, "$1")) --> here is ahi-ahi joe's the result
([a-zA-Z]+)\s+\1
以下内容适用于字母串
在这里,1将捕获第一场比赛。 只需在[]内添加有效的正则expression式
如果您希望对重复单词进行不区分大小写检查,请使用此选项。
(?i)\\b(\\w+)\\s+\\1\\b