连续两次正面展望失败,但每次都成功 [重复]

Two consecutive positive lookaheads fail but each individually succeeds [duplicate]

提问人:cybertosher 提问时间:11/9/2023 最后编辑:cybertosher 更新时间:11/9/2023 访问量:80

问:

我正在尝试用 Java 8 风格编写一个正则表达式,以任何顺序在多行文本文件中查找两个不同的静态字符串。我有一个在其他情况下有效的正则表达式,但不是这个,我无法确定为什么会这样。

我正在搜索以下文本,目的是确定字符串“crashinfo buffersize”和“crashinfo file”是否都以任何顺序出现。我在以下数据上使用正则表达式:(?=crashinfo buffersize)(?=crashinfo file)

exception data-corruption buffer truncate
exception data-corruption buffer log
exception crashinfo file flash:crashinfo
exception crashinfo buffersize 32
exception crashinfo maximum files 1
no exception crashinfo dump garbage-detector
no monitor environment temperature notifies
monitor environment temperature syslog
no monitor environment temperature history
monitor environment temperature low -25

我希望这匹配,因为两个字符串都在文件中,但正则表达式匹配失败。

我只搜索了它本身,而且是匹配的。我也只搜索了它本身,它也匹配。我预计将两者放在一起也会匹配,因为每个匹配都是孤立的。但比赛失败了。(?=crashinfo buffersize)(?=crashinfo file)

我在其他情况下使用过这样的结构,它们工作正常。在这个文件中,每个单独的展望都会自行成功,但如果我将它们一起使用,它们就会失败。我被困住了。谁能说明我做错了什么?

Java 正则表达式 正则表达式环访

评论

0赞 Bohemian 11/9/2023
您的输入是否是带有嵌入式换行符的多行的单个字符串?
0赞 sln 11/9/2023
buffersize并且不能占用相同的空间。每个断言都从同一位置进行测试。为了涵盖这两者,它只是一个断言:file(?=crashinfo (?:buffersize|file))
0赞 sln 11/9/2023
相邻的词是尝试对吗?即使一切都被标记为重复,但这不是任何订单/任何地方的重复!
0赞 cybertosher 11/9/2023
关闭此内容的人没有阅读该问题。我不是在问如何写正则表达式,我是在问为什么我写的正则表达式,看起来它应该起作用,却没有。
1赞 Holger 11/9/2023
您在哪种情况下使用正则表达式?或者,换句话说,你为什么要使用前瞻?

答:

0赞 AztecCodes 11/9/2023 #1

我的正则表达式:

String regex = "(?s)(?=.*crashinfo buffersize)(?=.*crashinfo file)";

评论

0赞 sln 11/9/2023
海报似乎集中在crashinfo旁边的这些词上。虽然不确定。
0赞 cybertosher 11/9/2023
就我而言,我只对两个文字字符串是否以任何顺序存在于文件中感兴趣。对不起,在我原来的帖子中可以更清楚。
0赞 cybertosher 11/9/2023
请参阅上面的评论。建议的解决方案将匹配“crashinfo buffersize”或“crashover file”。如果缺少一个,匹配仍然成功。如果缺少一个,我需要匹配才能通过。这让我发疯,因为我在另一个文本中没有空格的文件中使用这个正则表达式没有问题。我没有理由看出为什么这个正则表达式会失败。
0赞 Cary Swoveland 11/9/2023
我假设 OP 不希望匹配或 .如果是这样,请考虑添加单词边界。"precrashinfo buffersize""crashinfo filename"
0赞 Reilas 11/9/2023 #2

使用非捕获组联合语法。

(?=crashinfo (?:buffersize|file))

评论

0赞 cybertosher 11/9/2023
这似乎会寻找 OR,但至少根据 RegexBuddy 的说法,它可以工作。感谢您的解决!crashinfo buffersizecrashinfo file
1赞 cybertosher 11/9/2023
这似乎寻找 OR,但不是两者兼而有之。如果我将其更改为它仍然匹配,即使升字符串“crashinfo foo”在我的测试用例中没有出现在任何地方crashinfo buffersizecrashinfo file(?=crashinfo (?:buffersize|foo))
0赞 Reilas 11/9/2023
@cybertosher,它将匹配“crashinfo buffersize”“crashinfo file”。你是说只有当两者都存在时才应该匹配?我忽略了这一点,我会编辑答案。