Нежадные круглые скобки - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть строка mysql://user:pw@host/db?reconnect=true и следующее (неправильное) регулярное выражение: /^mysql:\/\/(.+):(.+)@(.+)\/(.+)\??.*$/

Это совпадения, которые я получаю:

["user", "pw", "host", "db?reconnect=true"]

Единственное проблемное совпадение - "db?reconnect=true", которым я намерен быть "db"

Я пробовал не жадные квалификаторы для обоих "?"после "db" и после последнего захвата скобки безуспешно.Кажется, что последняя заключительная скобка является жадной несмотря ни на что.Есть ли даже решение для этого?

Приветствия!

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Все ваши квантификаторы жадные;вам нужно добавить ?, чтобы сделать их нежадными.В этом конкретном случае вы должны быть осторожны, потому что, если вы не уверены, что он должен соответствовать запросу GET отдельно, то из-за жадности также пропускается b в db.Здесь есть два приличных варианта:

  1. Явно не жадный: /^mysql:\/\/(.+):(.+)@(.+)\/(.+?)(?:\?.*)?$/ (Вам нужно сгруппировать ? с остальной частью запроса GET; если он необязателен, то не жадныйкод остановится рано, проигнорируйте необязательный ? и просто засуньте все в совпадение на жадного .*)
  2. Жадного, но исключая ? из того, с чем он желает совпадать: /^mysql:\/\/(.+):(.+)@(.+)\/([^?]+)(?:\?.*)?$/Поскольку ? не может присутствовать в допустимом URL-адресе, кроме случаев разделения GET-запроса, мы переключаемся с .+ на [^?]+, чтобы сохранить все до ?
0 голосов
/ 11 декабря 2018

Вы можете использовать отрицательный класс символов [^?], чтобы сопоставить что-либо , за исключением знак вопроса ?.

Попробуйте:

^mysql:\/\/(.+?):(.+?)@(.+?)\/([^?]+)

Regex101

Group 1.    `user`
Group 2.    `pw`
Group 3.    `host`
Group 4.    `db`
...