在正则表达式中排除一个单词的方法(不使用前瞻性?)



如果我有输入:

hello cat
hellocat
hello gat

我想找到一个以单词"你好"开头,后面没有单词"猫"的行。

是否可以否定一个组,例如:

hello[^(s?cat)]

或者你只能否定那个位置上的一组字符?如果没有,有什么方法可以做到这一点?我能做到这一点的唯一方法是积极展望:

hello(?!s?cat)

但我想知道是否有其他方法可以做到这一点。

还有另一种不用环视的方法,我认为这是一个有趣的概念:/hello(?:scat)|(hellos.*)/

在这种情况下,我们首先匹配我们不想要的东西(但不捕获它(,然后如果第一部分失败,我们只捕获第二部分,这意味着在捕获中,您将始终拥有不包含cat的东西。

您可以在本例中进行检查https://regex101.com/r/bydCGb/3,在匹配信息框中,"组1"捕获-并检查替换部分-我们从来没有猫部分。

根据你的情况,你可以说:如果有捕获组1,那就做点什么。

我认为如果不使用负前瞻,这是不可能的。

可以使用[^abc]约定排除特定字符。然而,你必须明确地排除猫,但允许所有几乎是猫的东西。

例如

((hello)ca[^t]|(hello)c[^a]|(hello)[^c])

然后得到对应于hello组的捕获组。hello后面的空格使其成为一个选项,这让它变得有点困难。这个可选空间可以通过以下方式捕获:

((hello)sca[^t]|(hello)sc[^a]|(hello)s[^c]|(hello)ca[^t]|(hello)c[^a]|(hello)[^c ])

注意:它有所有六个选项,最后一个添加了一个可选空间,以确保前三个选项不会被捕获。

此处测试:https://regex101.com/r/sgoHyJ/1

我想你可以理解他们为什么发明负面表情广告了。。。

如果不使用负前瞻,使用纯正则表达式就无法轻松做到这一点。然而,如果您在某些编程语言中通过API进行这些regex调用,您可以使用以下积极的短语来表达匹配:

^hellob.*

和以下阴性:

^hello catb

也就是说,有效匹配在第一模式上为正,在第二模式上为负。在Java中,这个提议的解决方案看起来是这样的:

String input = "hello gat";
if (input.matches("hello\b.*") && !input.matches("hello cat\b.*")) {
System.out.println("MATCH");
}
else {
System.out.println("NO MATCH");
}

相关内容

最新更新