我正在尝试解决这个CodingBat问题:
如果给定的字符串包含"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.*");
}
Run Code Online (Sandbox Code Playgroud)
知道如何用正则表达式处理上述约束吗?
Kel*_*vin 12
一个否定的字符类应该做的伎俩: str.matches(".*(?:^|[^.])xyz.*")
在这里,我们使用非捕获组(?:^|[^.])来确保我们在字符串的开头匹配^,或者在不是句点的任何位置匹配[^.]
我个人使用过这个解决方案,但还有很多其他变种:
str.matches("(.*[^.])?xyz.*")
Run Code Online (Sandbox Code Playgroud)
我只是确保如果前面有任何东西xyz,那么期间.不会立即出现.
您还可以编写一个后备解决方案:
str.matches(".*(?<!\\.)xyz.*");
Run Code Online (Sandbox Code Playgroud)
(?<! )part是负面的lookbehind,\\.(literal period)是我们要检查的模式.