我写了一个正则表达式来检测单词末尾的重复o
。这是我的正则表达式;
Pattern p = Pattern.compile(".*[o]\\1+");
例如,如果我有一个单词zoo
,masoo
或kjuoo
,则应该检测到它,如果有一个单词eoop
,loop
或snoop
它不应该被检测到,因为它应该仅检测以oo
结尾的单词(2 o
)
我该如何解决这个问题?
答案 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)