无法使Java Regex正确匹配

时间:2012-11-07 18:31:48

标签: java regex

我正在尝试为CodingBat problem创建一个正则表达式,我必须返回一个布尔值,如果一个String包含短语' xyz',但是' xyz'那些被期间不计算在内的人。到目前为止,我尝试过的正则表达式是:

str.matches("(?<!\\.)xyz");
str.matches("[^\\.]xyz")

但两种方式都不符合我的意图。如果有人能指引我朝着正确的方向努力让我发挥作用,我将感激不尽。

编辑:由于有人要求进行测试:

xyzThere(&#34; abcxyz&#34;)→true
xyzThere(&#34; abc.xyz&#34;)→false
xyzThere(&#34; xyz.abc&#34;)→true
xyzThere(&#34; abcxy&#34;)→false
xyzThere(&#34; xyz&#34;)→true
xyzThere(&#34; xy&#34;)→false
xyzThere(&#34; x&#34;)→false
xyzThere(&#34;&#34;)→false
xyzThere(&#34; abc.xyzxyz&#34;)→true
xyzThere(&#34; abc.xxyz&#34;)→true
xyzThere(&#34; .xyz&#34;)→false
xyzThere(&#34; 12.xyz&#34;)→false
xyzThere(&#34; 12xyz&#34;)→true
xyzThere(&#34; 1.xyz.xyz2.xyz&#34;)→false

1 个答案:

答案 0 :(得分:3)

matches将测试整个字符串(在模式周围隐式添加^$)。快速解决方法是将.*添加到模式的开头和结尾。否则你的第一次尝试是正确的。第二个将在字符串的开头失败,因为它需要一个非.字符(但必须有一个)。

public boolean xyzThere(String str) {
    return str.matches(".*(?<!\\.)xyz.*");
}

这无疑是一个黑客攻击。要对字符串的任何部分进行常规的正则表达式测试,您需要使用更多的OOP:

public boolean xyzThere(String str) {
    return java.util.regex.Pattern.compile("(?<!\\.)xyz").matcher(str).find();
}

(我似乎无法在CodingBat上使用import。)