Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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
如何仅在某些行上获得多个Java正则表达式匹配_Java_Regex_Regex Lookarounds_Regex Group_Multiple Matches - Fatal编程技术网

如何仅在某些行上获得多个Java正则表达式匹配

如何仅在某些行上获得多个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 |

我正在调用一个我无法更改的API。也就是说,我不能作为两个连续的正则表达式或类似的东西来做这件事。API是这样编写的(当然是简化的):

我这样调用它:

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之外,其他都匹配
还有很多,太多了,无法列举。我试过各种后视,但都没用

我想要的是所有匹配“thing[0-9]+”的字符串,但只有以“good:”或“better:”开头的行中的字符串


或者,更一般地说,我希望多行模式中有多个匹配项,但只能来自具有特定前缀的行。

您必须使用基于
\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]+)