'Multiple matching groups regex
I thought that surrounding expressions with brackets allowed you to do multiple matches.
/(^(.*?)\?).(([?&])([^=]+)=([^&]+))/g
The above regex should first match everything before ?, then the second one should match all of the URL Parameters.
search.php?make=8&vehicle_type=car&location_path=used&sort=nis&p=
Both work perfect alone, but not together, I get no matches.
Solution 1:[1]
There are no matches, as this part of the pattern \?).(([?&]) expects to match 3 characters: ?, any character due to the dot, and either ? or &
If you want 2 separate groups, 1 for the url, and the second one with all the parameters, you can match the first key/value pair and optionally repeat more key/value pairs.
^([^?&]*)[?&]([^=]+=[^&]*(?:&[^=]+=[^&]*)*)$
^Start of string([^?&]*)Capture group 1, match any character except?and&[?&]Match either?or&(Capture group 2[^=]+=[^&]*Match a key/value pair, exluding the=before and excluding the&after(?:&[^=]+=[^&]*)*Optionally repeat the previous pattern with a leading&
)Close capture group 2$End of string
Solution 2:[2]
I understand the question 2 different ways
Match 2 groups: the url + the parameters string
(^([^?]*)|([^?]*)$)
Will match:
- search.php
- make=8&vehicle_type=car&location_path=used&sort=nis&p=
This works because we look for a string of any non-? character until the first is found, OR ("|") a string of non-? characters that go to the end of the test string.
https://regex101.com/r/uD5SGG/1
Match multiple groups: the url + one group per parameter
(^([^?]*)|([\w_]*=[\w_]*))
Will match:
- search.php
- make=8
- vehicle_type=car
- location_path=used
- sort=nis
- p=
Note that the & do not match. Again, we use | as in "OR". [\w_]* indicates that we look for parameters composed of letters or "_".
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | The fourth bird |
| Solution 2 |
