我正在尝试解决this CodingBat problem:
如果给定的字符串包含“xyz”的外观,则返回true,其中xyz不直接以句点(。)开头。所以“xxyz”计算但“x.xyz”没有。
xyzThere(“abcxyz”)→true
xyzThere(“abc.xyz”)→false
xyzThere(“xyz.abc”)→true
我正在尝试用正则表达式来解决这个问题,但我不确定如何处理where the xyz is not directly preceeded by a period
要求。
我对没有约束的问题的解决方案是:
public boolean xyzThere(String str) {
return str.matches(".*xyz.*");
}
知道如何用正则表达式处理上述约束吗?
答案 0 :(得分:12)
否定的角色类应该可以做到这一点:str.matches(".*(?:^|[^.])xyz.*")
我们在这里使用非捕获组(?:^|[^.])
来确保我们匹配字符串^
的开头,或者不是句点[^.]
的任何位置
答案 1 :(得分:7)
我个人使用过这个解决方案,但还有很多其他变种:
str.matches("(.*[^.])?xyz.*")
我只是确保如果xyz
前面有任何内容,那么句号.
不会立即出现。
您还可以编写一个后备解决方案:
str.matches(".*(?<!\\.)xyz.*");
(?<! )
部分是负面的后视,\\.
(文字句号)是我们想要检查的模式。