2

我正在尝试为CodingBat 问题创建一个正则表达式,我必须根据字符串是否包含短语“xyz”返回一个布尔值,但以句点开头的“xyz”不计算在内。到目前为止,我尝试的正则表达式是:

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

但两者都不是我想要的方式。如果有人能引导我朝着正确的方向发展,我将不胜感激。

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

xyzThere("abcxyz") → true
xyzThere("abc.xyz") → false
xyzThere("xyz.abc") → true
xyzThere("abcxy") → false
xyzThere("xyz") → true
xyzThere("xy") → 假
xyzThere("x") → 假
xyzThere("") → 假
xyzThere("abc.xyzxyz") → 真
xyzThere("abc.xxyz") → 真
xyzThere(".xyz") → 假
xyzThere("12 .xyz") → 假
xyzThere("12xyz") → 真
xyzThere("1.xyz.xyz2.xyz") → 假

4

1 回答 1

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();
}

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

于 2012-11-07T18:35:14.290 回答