如果在所需字符串之前未直接包含字符,则正则表达式仅匹配

时间:2012-11-18 16:20:28

标签: java regex

我正在尝试解决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.*");
}

知道如何用正则表达式处理上述约束吗?

2 个答案:

答案 0 :(得分:12)

否定的角色类应该可以做到这一点:str.matches(".*(?:^|[^.])xyz.*")

我们在这里使用非捕获组(?:^|[^.])来确保我们匹配字符串^的开头,或者不是句点[^.]的任何位置

答案 1 :(得分:7)

我个人使用过这个解决方案,但还有很多其他变种:

str.matches("(.*[^.])?xyz.*")

我只是确保如果xyz前面有任何内容,那么句号.不会立即出现。

您还可以编写一个后备解决方案:

str.matches(".*(?<!\\.)xyz.*");

(?<! )部分是负面的后视,\\.(文字句号)是我们想要检查的模式。