Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在正则表达式中排除单词的方法(不带前瞻?)_Regex - Fatal编程技术网

Regex 在正则表达式中排除单词的方法(不带前瞻?)

Regex 在正则表达式中排除单词的方法(不带前瞻?),regex,Regex,如果我有意见: hello cat hellocat hello gat 我想找一行以“hello”开头,后面没有“cat”的 是否可以否定一个组,例如: hello[^(\s?cat)] 或者您只能在该位置对一组字符求反?如果没有,有什么方法可以做到这一点?我能做到这一点的唯一方法是积极地向前看: hello(?!\s?cat) 但我想知道是否有其他方法可以做到这一点。如果不使用负前瞻,你就无法轻松地使用纯正则表达式来实现这一点。但是,如果您是通过某种编程语言中的API进行这些正则表达式

如果我有意见:

hello cat
hellocat
hello gat
我想找一行以“hello”开头,后面没有“cat”的

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

hello[^(\s?cat)]
或者您只能在该位置对一组字符求反?如果没有,有什么方法可以做到这一点?我能做到这一点的唯一方法是积极地向前看:

hello(?!\s?cat)
但我想知道是否有其他方法可以做到这一点。

如果不使用负前瞻,你就无法轻松地使用纯正则表达式来实现这一点。但是,如果您是通过某种编程语言中的API进行这些正则表达式调用,则可以使用以下积极语句来表示匹配:

^hello\b.*
以及以下负面影响:

^hello cat\b
也就是说,有效匹配在第一个模式上为正,在第二个模式上为负。在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");
}

我认为不使用消极的前瞻性是不可能的

您可以使用
[^abc]
约定排除特定字符。然而,您必须明确地排除cat,然后允许几乎是cat的所有内容

例如

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

((hello)\sca[^t]|(hello)\sc[^a]|(hello)\s[^c]|(hello)ca[^t]|(hello)c[^a]|(hello)[^c ])
注意:它有所有六个选项,最后一个选项添加了一个可选空间,以确保前三个选项不会被捕获

此处测试:


我想你可以理解为什么他们发明了负面形象…

还有另一种没有环顾四周的方式,我认为这是一个有趣的概念,值得一提:
/hello(?:\scat)|(hello\s.*)/

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

在本例中,您可以在“匹配信息”框中选中“组1”捕获,也可以选中替换部分-我们从来没有cat部分


根据您的案例,您可以说:如果有捕获组1,那么做一些事情。

这是一个负面展望,但我认为这是您的用例的发展方向。嗯,我认为您需要做一些额外的步骤。首先构建一个正则表达式,该正则表达式匹配以hello开头,后跟cat的行,然后删除所有匹配项。然后,您可以查找任何以
hello
开头的行,而不必担心后面跟着
cat
,因为您已经删除了它们。消极/积极的表情是有帮助的。这是一个学术问题还是一个寻求实现的问题?@AER——谢谢你下面的回答——这真的很有趣!这更多的是为了看到解决这一问题的替代方法。首先,我可能会使用带有简单字符串/三元表达式的编程语言,如果它比其中的简单“cat”更高级的话。然后,如果在regex中,我将使用lookahead。因此,这个问题更多的是探索处理正则表达式问题的可能方法,以获得正确的解决方案(知道正确解决方案中“最简单的”显然是前瞻性的)…我认为现在对我来说太早了。我没想清楚…你完全正确。我确实发现了一个错误,那就是添加的空格导致了这个错误!非常有挑战性。Lookaheads绝对是这项工作的合适工具。更新后的版本说明了被捕获的空间不是c,讨厌…对我来说,这是唯一体面的解决方案。我想那时需要两层过滤。至少我的问题解决了
((hello)\sca[^t]|(hello)\sc[^a]|(hello)\s[^c]|(hello)ca[^t]|(hello)c[^a]|(hello)[^c ])