编写正则表达式以查找连续字符“o”

时间:2013-07-23 11:45:19

标签: java regex

我写了一个正则表达式来检测单词末尾的重复o。这是我的正则表达式;

Pattern p = Pattern.compile(".*[o]\\1+");

例如,如果我有一个单词zoomasookjuoo,则应该检测到它,如果有一个单词eooploopsnoop它不应该被检测到,因为它应该仅检测以oo结尾的单词(2 o

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

您最后应添加$,以便在最后匹配它。您需要捕获o,而不是使用括号字符类不会捕获匹配项,\\1在这种情况下不会给您任何内容。

此外,由于您最后只担心o's,因此您可以从头开始删除.*并使用Matcher#find()代替Matcher#matches()。所以,你的正则表达式应该是:

Pattern p = Pattern.compile("(o)\\1+$");

或者,您可以直接使用{n,m}量词与o,将第二个参数保持为空,以匹配2个或更多o

Pattern p = Pattern.compile("o{2,}$");

  

它应该只检测以oo(2 o's)结尾的单词

如果您只想匹配2 o's,则可以从反向引用中删除量词+

Pattern p = Pattern.compile("(o)\\1$");

或只是使用不同的量词 - {n}

Pattern p = Pattern.compile("o{2}$");

示例代码:

Pattern p = Pattern.compile("o{2}$");
String[] words = {"zoo", "kjuoo", "snoop", "loop"};

for (String word: words) {
    Matcher matcher = p.matcher(word);
    System.out.println(word + " : " + matcher.find());  // Use `find()`
}

<强>输出:

zoo : true
kjuoo : true
snoop : false
loop : false

答案 1 :(得分:3)

将正则表达式更改为

Pattern p = Pattern.compile(".*(o)\\1+");

因为要创建群组,您需要使用(),而不是[]

演示:

Pattern p = Pattern.compile(".*(o)\\1+");
for (String s: new String[]{"zoo","masoo","kjuoo","loop","snoop"}){
    System.out.println(s+":\t"+p.matcher(s).matches());
}

输出:

zoo:    true
masoo:  true
kjuoo:  true
loop:   false
snoop:  false

答案 2 :(得分:0)

oo(?!\w)

这将匹配oo,因为之后没有字符,您可以测试here

适用于您提供的所有示例。