Java 仅当字符未直接包含在所需字符串之前时,正则表达式才匹配

Java 仅当字符未直接包含在所需字符串之前时,正则表达式才匹配,java,regex,Java,Regex,我试图解决: 如果给定字符串包含“xyz”外观,其中xyz前面没有直接加句点(.),则返回true。所以“xxyz”算数,但“x.xyz”不算数 xyzThere(“abcxyz”)→ 正确 xyzThere(“abc.xyz”)→ 假 xyzThere(“xyz.abc”)→ 真的 我试图用正则表达式解决这个问题,但我不确定如何处理xyz不直接由句点要求前置的 对于没有约束的问题,我的解决方案如下: public boolean xyzThere(String str) { retur

我试图解决:

如果给定字符串包含“xyz”外观,其中xyz前面没有直接加句点(.),则返回true。所以“xxyz”算数,但“x.xyz”不算数

xyzThere(“abcxyz”)→ 正确
xyzThere(“abc.xyz”)→ 假
xyzThere(“xyz.abc”)→ 真的

我试图用正则表达式解决这个问题,但我不确定如何处理xyz不直接由句点要求前置的

对于没有约束的问题,我的解决方案如下:

public boolean xyzThere(String str) {
    return str.matches(".*xyz.*");
}

任何关于如何用正则表达式处理所述约束的想法?

一个否定字符类应该做到这一点:
str.matches(“.*(:^.[^.])xyz.*)


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

我个人使用了此解决方案,但还有很多其他变体:

str.matches("(.*[^.])?xyz.*")
我只是确保如果在
xyz
前面有任何内容,那么周期
不会立即在前面

您还可以编写一个“回头看”解决方案:

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

str.matches(“*(?是您正在寻找的。但要使用它,您还需要了解它@KelvinMackay:Java
匹配项
假定锚定。不过,我通过了CodingBat的测试用例。请提供代码失败的测试用例。@KelvinMackay:问题是我编写的正则表达式与前面有
^
$
的版本是等效的在后面,感谢
String
类中的
matches
。如果不假设锚点,您的参数将是正确的。我理解这一点,但这不是为什么我尝试时它不起作用的原因。无论如何,这并不重要-它在CodingBat上起作用,所以您的答案是正确的:)我确实相信每次使用str.matches都会强制编译(任意正则表达式);