как я могу проверить, есть ли хотя бы одно окружающее пространство в регулярном выражении?

#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.png

3. @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 в соответствии с Regex101

3. В вашем ответе выбираются пробелы вокруг слова обновления. Есть ли какой-либо способ удалить эти пробелы?

Ответ №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 более точен для моей проблемы.