如果我有输入:
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");
}