有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java可选捕获组

我需要解析一些HTTP请求,现在需要解析GET参数

我现在的正则表达式是

(GET|POST)\s(.*)(\?.*)\sHTTP\/(\d\.\d)

我想匹配以下内容:

"GET /page.html HTTP/1.1"
  => group1: "GET" group2: "/page.html" group3: "" group4: "1.1"

"GET /page.html?param1=foo&param2=bar HTTP/1.1"
  => group1: "GET" group2: "/page.html" group3: "param1=foo&param2=bar" group4: "1.1"

我当前的正则表达式仅与第二个正则表达式匹配


共 (1) 个答案

  1. # 1 楼答案

    用可选的非捕获组包装第三个捕获组,并在第二个捕获组中使用惰性*?量词,将尽可能少的字符匹配到组2中(对于匹配查询参数的组3,如果存在,则抓取这些数据):

    (GET|POST)\s(.*?)(?:(\?.*)\s)?HTTP\/(\d\.\d)
                   ^ ^^^^^^^^^^^^^
    

    详细信息

    • (GET|POST)-第1组GETPOST子串
    • \s-一个空格
    • (.*?)-组2:任意0+个字符,尽可能少(以便在查询字符串存在的情况下将查询字符串中的所有参数生成给下一个捕获组)
    • (?:(\?.*)\s)?-可选(1或0次)非捕获组匹配:
      • (\?.*)-第3组捕获一个{},尽可能多的任何0+字符,直到最后一个
      • \s-witespace
    • HTTP\/-aHTTP/文字字符序列
    • (\d\.\d)-第4组捕获一个数字.和一个数字

    regex demo

    enter image description here

    现在,如果字符串中没有?,组3将不会捕获任何内容,因为强制性的?\s作为序列的一部分是可选的