我正在尝试为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
答案 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
。)