Совпадение с чем-либо до определенного персонажа - PullRequest
0 голосов
/ 21 января 2019

У меня есть следующие строки

/search?checkin=2018-10-25&checkout=2018-10-27&id=bandung-108001534490276290&page=1&room=1&sort=popularity&type=CITY
/search?checkin=2018-12-09&checkout=2018-12-13&id=singapore-108001534490299035&maxPrice=&minPrice=&room=1&type=REGION
/search?checkin=2018-10-22&checkout=2018-10-23&lat=-6.1176043&long=106.7767146&maxPrice=&minPrice=&room=1&type=COORDINATE
/search?page=1&room=1&type=POI&id=taman-mini-indonesia-indah-110001539700828313&checkin=2018-11-14&checkout=2018-11-16&sort=distance

Я хочу получить все строки, начинающиеся с &id= до первого &, чтобы они возвращали

id=bandung-108001534490276290
id=singapore-108001534490299035
id=taman-mini-indonesia-indah-110001539700828313

Когда я попробовалэто регулярное выражение \&id=.*\& не соответствует моим требованиям.

Как мне решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Позитивный взгляд вперед (?=)

Попробуйте позитивный взгляд:

/&id=.+?(?=&)|&id=.+?$/gm

Эта часть: (?=&) означает: если найден &, то все до совпадения. Чередование: | (это логический элемент OR) - это обновление в отношении комментария Ника о том, что если параметр заканчивается &id=... Это тот же самый матч, но вместо поиска & он будет искать конец строки $. Обратите внимание, что флаг m ulti-line используется, чтобы $ представлял EOL.

Демо

var str = `/search?checkin=2018-10-25&checkout=2018-10-27&id=bandung-108001534490276290&page=1&room=1&sort=popularity&type=CITY
/search?checkin=2018-12-09&checkout=2018-12-13&id=singapore-108001534490299035&maxPrice=&minPrice=&room=1&type=REGION
/search?page=1&room=1&type=POI&id=indo-1999999051158
/search?checkin=2018-10-22&checkout=2018-10-23&lat=-6.1176043&long=106.7767146&maxPrice=&minPrice=&room=1&type=COORDINATE
/search?page=1&room=1&type=POI&id=taman-mini-indonesia-indah-110001539700828313&checkin=2018-11-14&checkout=2018-11-16&sort=distance
/search?page=1&room=1&type=POI&id=indonesia-1100055689`;
var rgx = /&id=.+?(?=&$)|&id=.+?$/gm;
var res = rgx.exec(str);

while (res != null) {
  console.log(res[0]);
  res = rgx.exec(str);
}
0 голосов
/ 21 января 2019

Я бы пошел с [?&](id=[^&]+).

  • [?&] - ? или &, потому что порядок параметров GET обычно не гарантируется, и вы можете получить идентификатор в первую очередь - что-то вроде /search?id=something-123456&checkin=2018-10-25&…
  • [^&]+ - хотя бы один символ, который не &
  • () отмечает группу захвата

Демонстрация в JS:

const strings = [
  "/search?checkin=2018-10-25&checkout=2018-10-27&id=bandung-108001534490276290&page=1&room=1&sort=popularity&type=CITY",
  "/search?checkin=2018-12-09&checkout=2018-12-13&id=singapore-108001534490299035&maxPrice=&minPrice=&room=1&type=REGION",
  "/search?checkin=2018-10-22&checkout=2018-10-23&lat=-6.1176043&long=106.7767146&maxPrice=&minPrice=&room=1&type=COORDINATE",
  "/search?page=1&room=1&type=POI&id=taman-mini-indonesia-indah-110001539700828313&checkin=2018-11-14&checkout=2018-11-16&sort=distance]"
]

const regex = /[?&](id=[^&]+)/

strings.forEach(string => {
  const match = regex.exec(string)
  if (match) {
    console.log(match[1])
  }
})

Демонстрация и объяснение на Regex101: https://regex101.com/r/FBeNDN/1/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...