Java正则表达式,无法正确捕获最后一个组
我试图用Javaregex解析几个简单的行:Java正则表达式,无法正确捕获最后一个组,java,regex,Java,Regex,我试图用Javaregex解析几个简单的行: [txt1] [txt2] [txt3] /some/long/path?params=1,2,3 [txt1] [txt2] [txt3] /path/ [txt1] [txt2] [txt3] / 我的正则表达式字符串是^\[(.*)\]\[(.*)\]\[(.*)?\](/.*)(\?*) 我正在努力捕捉最后一组——用我的正则表达式,只有第一行匹配模式,而其他两行不匹配。如果我将正则表达式更改为^\[(.*?)\[(.*?)\]\[(.*?*
[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个匹配的组?使您最后一个,但只有一个
*
延迟,使最后一个捕获组可选,并附加$
,字符串结束锚定:
^\[(.*?)] \[(.*?)] \[(.*?)] (/.*?)(\?.*)?$
^ ^^
见
组中的(/.*)
应该是惰性的,因为我们需要允许后续组中填充尽可能多的字符*?
-必须是可选的,因为文本可能不存在(\?*)
是必需的,因为前面两组是可选的,因此字符串末尾的文本可能不匹配。通过这种方式,我们需要正则表达式引擎来获取该行的其余部分$
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
使您只剩下一个
*
延迟,使最后一个捕获组可选,并附加$
,字符串结束锚点:
^\[(.*?)] \[(.*?)] \[(.*?)] (/.*?)(\?.*)?$
^ ^^
见
组中的(/.*)
应该是惰性的,因为我们需要允许后续组中填充尽可能多的字符*?
-必须是可选的,因为文本可能不存在(\?*)
是必需的,因为前面两组是可选的,因此字符串末尾的文本可能不匹配。通过这种方式,我们需要正则表达式引擎来获取该行的其余部分$
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个或多个
每个输入的输出是什么?每个输入的输出是什么?