如何仅在某些行上获得多个Java正则表达式匹配
我正在调用一个我无法更改的API。也就是说,我不能作为两个连续的正则表达式或类似的东西来做这件事。API是这样编写的(当然是简化的): 我这样调用它:如何仅在某些行上获得多个Java正则表达式匹配,java,regex,regex-lookarounds,regex-group,multiple-matches,Java,Regex,Regex Lookarounds,Regex Group,Multiple Matches,我正在调用一个我无法更改的API。也就是说,我不能作为两个连续的正则表达式或类似的东西来做这件事。API是这样编写的(当然是简化的): 我这样调用它: apiMethod("(thing[0-9]+)"); 我想看到打印出来的六行,从04到09,每行一行。到目前为止我还没有成功。我尝试过一些不起作用的事情: “(thing[0-9]+)-这匹配所有12个东西,这不是我想要的 “^(?:good | better:(thing[0-9]+)”-这只匹配第4和第7项 “^(?:(?:good |
apiMethod("(thing[0-9]+)");
我想看到打印出来的六行,从04到09,每行一行。到目前为止我还没有成功。我尝试过一些不起作用的事情:
- “(thing[0-9]+)-这匹配所有12个东西,这不是我想要的
- “^(?:good | better:(thing[0-9]+)”-这只匹配第4和第7项
- “^(?:(?:good | better):*)(thing[0-9]+)-这只匹配第6和第9项
- “(?:(?:^good:|^ better:|,)*)(thing[0-9]+)”-除了1和10之外,其他都匹配
或者,更一般地说,我希望多行模式中有多个匹配项,但只能来自具有特定前缀的行。您必须使用基于
\G
的模式(在多行模式中):
\G
锚定力匹配为连续,因为它匹配上次成功匹配后的位置
如果行较短,也可以使用有限的可变长度查找:
(?<=^(?:good|better):.{0,1000})(thing[0-9]+)
(?(^(?:good | better):*thing\d{2}.*.
这将只匹配第一组,而不是全部匹配他说他需要多个匹配,这就是该模式的作用。您可以在一个匹配中使用非常类似的(?:^(?:good | better):*thing\d{2}.*.\n+)
今天我学习了\G锚点。非常感谢!顺便问一下,(!^)做了什么?我知道这是线锚点开头的负前瞻,但为什么需要它?很好的正则表达式,但是你不需要开始(?!^)的负前瞻,因为线从不以逗号开头。也就是说:“(?:\\G,|^(?good | better:)\\s*(thing\\d+)“
@Matt不需要它。请参阅我的评论。@mattmolone:因为\G
也匹配字符串的开头。添加(?!^)
可以避免这种情况,但如果没有以逗号开头的行,可以删除它。
(?:\G(?!^),|^(?:good|better):)\s*(thing[0-9]+)
(?<=^(?:good|better):.{0,1000})(thing[0-9]+)