10

我正在尝试解决这个 CodingBat 问题

如果给定字符串包含“xyz”的外观,其中 xyz 没有直接以句点 (.) 开头,则返回 true。所以“xxyz”很重要,但“x.xyz”没有。

xyzThere("abcxyz") → 真
xyzThere("abc.xyz") → 假
xyzThere("xyz.abc") → 真

我正在尝试用正则表达式解决这个问题,但我不确定如何处理where the xyz is not directly preceeded by a period需求。

我对没有约束的问题的解决方案是:

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

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

4

2 回答 2

13

否定字符类应该可以解决问题:str.matches(".*(?:^|[^.])xyz.*")

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

于 2012-11-18T16:23:26.997 回答
8

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

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

我只是确保如果 前面有任何内容xyz,则句点.不会紧随其后。

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

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

(?<! )部分是消极的后视,\\.(字面意思)是我们要检查的模式。

于 2012-11-18T16:32:41.463 回答