提问人:cybertosher 提问时间:11/9/2023 最后编辑:cybertosher 更新时间:11/9/2023 访问量:80
连续两次正面展望失败,但每次都成功 [重复]
Two consecutive positive lookaheads fail but each individually succeeds [duplicate]
问:
我正在尝试用 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)
我在其他情况下使用过这样的结构,它们工作正常。在这个文件中,每个单独的展望都会自行成功,但如果我将它们一起使用,它们就会失败。我被困住了。谁能说明我做错了什么?
答:
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 buffersize
crashinfo file
1赞
cybertosher
11/9/2023
这似乎寻找 OR,但不是两者兼而有之。如果我将其更改为它仍然匹配,即使升字符串“crashinfo foo”在我的测试用例中没有出现在任何地方crashinfo buffersize
crashinfo file
(?=crashinfo (?:buffersize|foo))
0赞
Reilas
11/9/2023
@cybertosher,它将匹配“crashinfo buffersize”或“crashinfo file”。你是说只有当两者都存在时才应该匹配?我忽略了这一点,我会编辑答案。
评论
buffersize
并且不能占用相同的空间。每个断言都从同一位置进行测试。为了涵盖这两者,它只是一个断言:file
(?=crashinfo (?:buffersize|file))