当前位置: 首页 > 知识库问答 >
问题:

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

郎曾笑
2023-03-14
[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个匹配组?

共有1个答案

郤飞英
2023-03-14

使您只剩一个.*为惰性,使最后一个捕获组为可选组,并附加$字符串结尾锚点:

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

请参阅正则表达式演示

  • (/.*?)组中的.*?应该是惰性的,因为我们需要允许用尽可能多的字符填充后续组
  • (\?.*)?-必须是可选的,因为文本可以不存在
  • $是必需的,因为前面的两个组是可选的,因此字符串末尾的文本可能不会匹配。这样,我们就需要regex引擎来获取行的其余部分。
Pattern pattern = Pattern.compile("^\\[(.*?)] \\[(.*?)] \\[(.*?)] (/.*?)(\\?.*)?$");
String[] ss = { "[txt1] [txt2] [txt3] /some/long/path?params=1,2,3", "[txt1] [txt2] [txt3] /path/", "[txt1] [txt2] [txt3] /"};
for (String s: ss) {
    Matcher matcher = pattern.matcher(s);
    while (matcher.find()){
        System.out.println("Next match for \"" + s + "\"" ); 
        System.out.println(matcher.group(1));
        System.out.println(matcher.group(2)); 
        System.out.println(matcher.group(3)); 
        System.out.println(matcher.group(4)); 
        System.out.println(matcher.group(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
 类似资料:
  • 问题内容: 我正在尝试使用Java expr在:之后捕获正确的部分,但是在以下代码中,打印的捕获组是整个字符串,怎么了? 问题答案: 子组的编号从1开始,全文为0。只需循环执行count + 1。

  • 假设我有这个虚拟URL,我需要提取植物及其颜色作为 下面的I have正在按预期捕获我需要的元素,但是当我的URL中的植物少于4株时,它无法捕获任何东西。底部有一个指向regex测试员的链接,其中有示例代码和URL,您可以使用。 如何修改这个正则表达式,使其动态工作,从而在不需要静态URL结构的情况下捕获可用内容。现在,假设我最多只能捕获4株植物(8组) https://regex101.com/

  • 问题内容: 使用(jdk 1.6),在给定以下代码的情况下,应用于主题字符串的正则表达式将仅捕获而不应捕获(模式)正则表达式: 奇怪的是,另一个类似的正则表达式(如应用于主题字符串)捕获组0和1,但不捕获组2。 相反,通过使用JavaScript的RegExp对象,可以将完全相同的正则表达式应用于完全相同的主题字符串,从而捕获所有组。我通过使用以下在线测试器亲自检查并重新检查了这一事实: http

  • 问题内容: 我有以下一行, 我需要拿这个词ABC, 我写了以下代码片段, 所以,如果我说得到,ABC:但是如果我说是ABC,那么我想知道 这是什么和意味着什么呢?如果有人可以用很好的例子向我解释,那会更好。 正则表达式模式中包含一个:,为什么结果忽略了它?组1是否检测到括号内的所有单词? 因此,如果我再加上两个括号,例如:,那么会有两个小组吗?group(1)将退还零件并退还零件? 给出该代码段的

  • 我有一个带有(?:)格式的非捕获组的java正则表达式,我不明白为什么它为非捕获组提供“null”匹配。 如果我将下面的正则表达式缩短为“@te(st)(?:AA)?”使用相同的?:非捕获组,它给出了我认为的预期行为,只匹配1个组和完全匹配。

  • 我有一个带有(?:)格式的非捕获组的java正则表达式,我不明白为什么它为非捕获组提供“null”匹配。 如果我把下面的正则表达式缩短为“@te(st)(?:aa)?”用同样的非捕获组,它给出了我所期望的行为,只匹配1组和完全匹配。 参见下面的正则表达式: 结果: “@te(st)(?:aa)”的结果使用相同的代码: 第一个将非捕获组匹配为null的正则表达式是什么?