/ / Voliteľná skupina zachytávania - java, regex, regex-skupina

Voliteľná skupina na snímanie - java, regex, regex-group

Musím analyzovať niektoré požiadavky HTTP a teraz chcem analyzovať parametre GET.

Môj súčasný regex je

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

Chcem odpovedať nasledujúcim:

"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"

Môj aktuálny regex sa zhoduje len s druhým

odpovede:

2 pre odpoveď č. 1

Zabaliť tretiu zachytávaciu skupinu s voliteľnou skupinou, ktorá nie je zachytená, a použiť lenivú *? kvantifikátor v rámci druhej zachytávacej skupiny, aby sa zhodoval čo najmenej znakov v skupine 2 (pre skupinu 3, ktorá zodpovedá parametrom dopytu, aby sa tieto údaje zachytili, ak sú prítomné):

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

podrobnosti:

  • (GET|POST) - skupina 1: buď GET alebo POST substrings
  • s - medzery
  • (.*?) - Skupina 2: akékoľvek 0+ znaky, čo najmenej (tak, aby sa všetky parametre v reťazci dopytu dostali do nasledujúcej zachytávacej skupiny, ak je prítomný reťazec dopytu)
  • (?:(?.*)s)? - voliteľné (1 alebo 0-krát) nezhodujúce sa skupiny:
    • (?.*) - skupina 3 zachytávajúca a ?, akékoľvek 0+ znakov čo najviac, až do posledného ...
    • s witespace
  • HTTP/ - a HTTP/ literálna sekvencia znakov
  • (d.d) - skupina 4 zachytávajúca číslicu, . a číslice.

Pozrite si regex demo.

tu zadajte popis obrázku

Teraz, ak nie ? skupina 3 nezachytí nič, čo je povinné ? a s sú nepovinné ako súčasť sekvencie.