Регулярное выражение для URL-адресов для получения элементов перед определенным шаблоном

#regex

#регулярное выражение

Вопрос:

У меня есть URL-адреса, которые выглядят примерно так: https://something/something/us/en/something . Я хочу извлечь элементы us раньше en . Для этого я использую регулярное выражение.

До сих пор я был близок к тому, чтобы получить это us использование '/[a-z]{2}[/en]' . Как получить две буквы перед en использованием регулярного выражения?

Комментарии:

1.Возможно https?:\\S ?\([a-z]{2})\enb , вот так regex101.com/r/zW7q49/1 Должен ли он быть / в URL-адресе?

2. [A-Za-z] (?=[\/]en[\/])

Ответ №1:

Вы указали обратную косую черту в URL-адресе и косую черту в вашем регулярном выражении. Предполагая прямые косые черты для URL-адреса и регулярного выражения, вы можете определить регулярное выражение соответствия или регулярное выражение замены:

 const url = 'https://something/something/us/en/something';
const regex1 = /b[a-z]{2}(?=/en/)/;
const regex2 = /^.*/([a-z]{2})/en/.*$/;
console .log('regex1 match: '   url.match(regex1));
console .log('regex2 replace: '   url.replace(regex2, '$1')); 

Вывод:

 regex1 match: us
regex2 replace: us
 

Объяснение регулярного выражения1 для соответствия:

  • b[a-z]{2} — ожидайте два символа после границы слова
  • (?=/en/) — с последующим позитивным прогнозом на /en/

Объяснение регулярного выражения 2 для замены:

  • ^.* .*$ — сканирование от самого начала до самого конца (привязка с обеих сторон)
  • / — в рамках этого ожидайте /
  • ([a-z]{2}) — затем запишите два символа в нижнем регистре
  • /en/ — тогда ожидайте /en/
  • при замене '$1' используется только захваченная группа

Ответ №2:

Во-первых, ваш URL-адрес некорректен, у вас неправильные косые черты.

Вы были очень близки, вам просто нужно было заключить в круглые скобки то, что вы хотели на самом деле «получить».

 /([a-z]{2})/en/
 

https://regex101.com/r/w1x7eY/1

Однако это сработает только в том случае, если вы на 100% уверены, что перед /en/ битом всегда будет 2 буквы.

Если вы хотели, чтобы он фиксировал часть пути раньше, попробуйте это.

 /([^/]*)/en/
 

https://regex101.com/r/0GJaq9/1