Захватить строку (с определенной точки) с регулярным выражением, не начинающимся с определенных букв - PullRequest
1 голос
/ 01 мая 2020

Я нахожусь в процессе написания регулярного выражения, которое захватывает все с определенной точки, если строка не начинается с определенных букв.

Точнее, я хочу захватить все от - до запятая, только если эта строка не начинается с pt.

en-GB должен захватывать -GB

Но если слово начинается с pt, я просто хочу пропустить capture:

pt-BR не должен ничего захватывать.

Я создал это регулярное выражение:

-[^,]*

, которое хорошо работает, за исключением того, что оно также захватывает строки, начинающиеся с pt.

К сожалению, я не могу использовать lookbehinds, так как он не поддерживается JS, поэтому я попытался использовать отрицательный взгляд таким образом:

^(?!pt).*

Проблема в том, что это захватывает всю строку, а не от -. Я попытался заменить .* чем-то, что начинает записываться с -, но пока мне это не удалось.

Я новичок в регулярном выражении, поэтому любое руководство будет полезным.

1 Ответ

1 голос
/ 01 мая 2020

Чтобы соответствовать pt- и любым двум буквам в начале строки или любым двум другим буквам, вы можете использовать

text.match(/^(?:pt-[a-zA-Z]{2}|[a-zA-Z]{2})/)

См. Демонстрационную версию regex . Подробности:

  • ^ - начало строки
  • (?:pt-[a-zA-Z]{2}|[a-zA-Z]{2}) - любой из двух вариантов:
    • pt-[a-zA-Z]{2} - pt- и любые два Буквы ASCII
    • | - или
    • [a-zA-Z]{2} - любые две буквы ASCII

Похоже, вам нужно использовать .replace метод по какой-то причине. Затем вы можете использовать

text.replace(/\b(?!pt-)([A-Za-z]{2})-[a-zA-Z]{2}\b/, '$1')

См. это демонстрационное выражение regex . Подробности:

  • \b - граница слова
  • (?!pt-) - нет pt- допускается сразу справа от текущего местоположения
  • ([A-Za-z]{2}) - Группа 1: любые две буквы ASCII
  • - - дефис
  • [a-zA-Z]{2} - любые две буквы ASCII
  • \b - граница слова
...