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