0

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

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

例如,如果我有一个单词zoomasoo或者kjuoo,它应该被检测到,如果有一个单词叫做eooploop或者它不应该被检测到,因为它应该只检测以(2 's)snoop结尾的单词ooo

我该如何解决这个问题?

4

3 回答 3

4

您应该$在末尾添加 a 以匹配它的末尾。而且您需要捕获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
于 2013-07-23T11:48:13.727 回答
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
于 2013-07-23T11:47:45.527 回答
0
oo(?!\w)

这将匹配oo,因为它后面没有字符,你可以在这里测试

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

于 2013-07-23T11:52:30.453 回答