#javascript #regex
#javascript #регулярное выражение
Вопрос:
У меня есть сообщение, подобное этому:
Upgrade is the first word in this paragraph.
In this paragraph, upgrade is the last word.
And this paragraph ends with upgrade.
But I don't want to find that word in this command `gigalixir:upgrade`.
Как вы можете видеть, в этом примере есть 4 экземпляра upgrade word. Но я хочу только 3 экземпляра. На самом деле мне нужно разделить мою строку, только если в слове upgrade есть пробел с обеих сторон, или если оно начинается с пробела, или если оно заканчивается пробелом. Я не хочу разделяться, если в слове нет окружающих пробелов.
Итак, согласно приведенному выше описанию, только слова обновления в первых 3 строках следует рассматривать как критическую точку.
Что я пробовал:
console.log(message.split(/s?upgrades?/g));
Может ли какой-нибудь эксперт по регулярным выражениям сказать мне, как я могу проверить, есть ли хотя бы одно окружающее пространство в приведенном выше регулярном выражении?
Комментарии:
1. Вы должны проверить look ahead и заглянуть за синтаксис регулярных выражений: stefanjudis.com/today-i-learned /…
2.
b
может быть…? i.stack.imgur.com/qZJTJ.png3. @ControlAltDel Я пробовал с отрицательным прогнозом, подобным этому:
/(?!:)upgrade/g
, но это не работает.4. @JGFMK Я не знаком с
/b
, но проверю это. Спасибо.5. ни
"Upgrade "
, ни" upgrade."
не имеют пробелов с обеих сторон. Единственное совпадениеupgrade
с пробелом с обеих сторон (согласно вашему описанию) — это во второй строке.
Ответ №1:
https://regex101.com/r/PROpvQ/1
(?<=s|^)[uU]pgradeb
Положительный взгляд на пробел или начало строки .. обновление в верхнем или нижнем регистре с границей слова в конце. (захватывает пробел, полный конец текста и т.д.).
Комментарии:
1. Спасибо за ответ, но легче понять ответ из JAT86.
2. О! Я вижу. После проверки вашего ответа я вижу, что выбрано только слово upgrade. В то время как другой ответ от JAT86 также выбирал пробелы. Спасибо за отличный ответ.
3. Поскольку браузеры, отличные от Chrome, не поддерживают просмотр вперед или назад, этот шаблон работает только в Chrome. Есть ли какой-либо способ игнорировать использование lookahead или lookbehind?
4. Я сбит с толку этим последним комментарием. Вы находите, что движки регулярных выражений, встроенные в реализации браузера, ведут себя по-разному с их отдельными движками JavaScript?
5. Да, именно это я могу воспроизвести.
Ответ №2:
Это может сработать:
(?:^| )[Uu]pgrade(?: ?)
(?:^| )
ищет либо начало ( ^
) строки, либо ( |
) начальный пробел
. Окружающие круглые скобки ()
используются для группировки, чтобы мы могли правильно использовать знак «или» |
. ?:
является необязательным и используется только для игнорирования захвата совпадений внутри круглых скобок. [Uu]
соответствует либо одной строчной, либо прописной букве «u».
(?: ?)
ищет конечный пробел. ?
означает соответствие нулю или одному единственному пробелу.
Комментарии:
1. Спасибо за ответ. Это работает отлично, но я там ничего не понял. 🙂 Не могли бы вы, пожалуйста, попытаться объяснить мне более подробно?
2. Сначала не будет работать, если у вас нет флага поиска без учета регистра
/gi
в соответствии с Regex1013. В вашем ответе выбираются пробелы вокруг слова обновления. Есть ли какой-либо способ удалить эти пробелы?
Ответ №3:
В зависимости от языка это может быть по-другому:
console.log(message.split(/(s*)upgrade(s*)/g));
if (length($1) > 0 and length($2) > 0) { GOOD }
else { BAD } # No space chars on either side of 'upgrade'
s соответствует пробелам и табуляциям, поэтому используйте ( *), если вас интересуют только пробелы, а не табуляции
Комментарии:
1. Спасибо за ответ, но ответ от @JAT86 более точен для моей проблемы.