Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.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 - Fatal编程技术网

Java正则表达式,无法正确捕获最后一个组

Java正则表达式,无法正确捕获最后一个组,java,regex,Java,Regex,我试图用Javaregex解析几个简单的行: [txt1] [txt2] [txt3] /some/long/path?params=1,2,3 [txt1] [txt2] [txt3] /path/ [txt1] [txt2] [txt3] / 我的正则表达式字符串是^\[(.*)\]\[(.*)\]\[(.*)?\](/.*)(\?*) 我正在努力捕捉最后一组——用我的正则表达式,只有第一行匹配模式,而其他两行不匹配。如果我将正则表达式更改为^\[(.*?)\[(.*?)\]\[(.*?*

我试图用Javaregex解析几个简单的行:

[txt1] [txt2] [txt3] /some/long/path?params=1,2,3
[txt1] [txt2] [txt3] /path/
[txt1] [txt2] [txt3] /
我的正则表达式字符串是
^\[(.*)\]\[(.*)\]\[(.*)?\](/.*)(\?*)

我正在努力捕捉最后一组——用我的正则表达式,只有第一行匹配模式,而其他两行不匹配。如果我将正则表达式更改为
^\[(.*?)\[(.*?)\]\[(.*?*)(/.*)
,那么所有3行都匹配,但第一行没有成功捕获(我只得到1个组
/some/long/path?params=1,2,3
,而不是2个
/some/long/path
?params=1,2,3


如何编写此正则表达式以使所有行都有5个匹配的组?

使您最后一个,但只有一个
*
延迟,使最后一个捕获组可选,并附加
$
,字符串结束锚定:

^\[(.*?)] \[(.*?)] \[(.*?)] (/.*?)(\?.*)?$
                                ^       ^^

  • (/.*)
    组中的
    *?
    应该是惰性的,因为我们需要允许后续组中填充尽可能多的字符
  • (\?*)
    -必须是可选的,因为文本可能不存在
  • $
    是必需的,因为前面两组是可选的,因此字符串末尾的文本可能不匹配。通过这种方式,我们需要正则表达式引擎来获取该行的其余部分
见a:

输出:

Next match for "[txt1] [txt2] [txt3] /some/long/path?params=1,2,3"
txt1
txt2
txt3
/some/long/path
?params=1,2,3
Next match for "[txt1] [txt2] [txt3] /path/"
txt1
txt2
txt3
/path/
null
Next match for "[txt1] [txt2] [txt3] /"
txt1
txt2
txt3
/
null

使您只剩下一个
*
延迟,使最后一个捕获组可选,并附加
$
,字符串结束锚点:

^\[(.*?)] \[(.*?)] \[(.*?)] (/.*?)(\?.*)?$
                                ^       ^^

  • (/.*)
    组中的
    *?
    应该是惰性的,因为我们需要允许后续组中填充尽可能多的字符
  • (\?*)
    -必须是可选的,因为文本可能不存在
  • $
    是必需的,因为前面两组是可选的,因此字符串末尾的文本可能不匹配。通过这种方式,我们需要正则表达式引擎来获取该行的其余部分
见a:

输出:

Next match for "[txt1] [txt2] [txt3] /some/long/path?params=1,2,3"
txt1
txt2
txt3
/some/long/path
?params=1,2,3
Next match for "[txt1] [txt2] [txt3] /path/"
txt1
txt2
txt3
/path/
null
Next match for "[txt1] [txt2] [txt3] /"
txt1
txt2
txt3
/
null

为了保证正确性和更好的性能,最好在正则表达式中使用否定字符类:

^\[([^]]*)\] \[([^]]*)\] \[([^]]*)\] (/[^?]*)(\?.*)?$

使用否定字符类,您不需要使用任何惰性量词,因为
[^?]*
将匹配任何非
字符中的0个或多个


最好在正则表达式中使用否定字符类,以确保正确性和更好的性能:

^\[([^]]*)\] \[([^]]*)\] \[([^]]*)\] (/[^?]*)(\?.*)?$

使用否定字符类,您不需要使用任何惰性量词,因为
[^?]*
将匹配任何非
字符中的0个或多个


每个输入的输出是什么?每个输入的输出是什么?