Искать слова, кроме определённых
Например, я хочу найти/подсчитать в ноутпаде все слова, кроме собак.
\w+([^(dog)]|[^(dogs)])
Как между 2 выражениями поставить И?
Решение:
\b(\w+)\b(?<!dog)\b(?<!dogs)
Ответы (2 шт):
Автор решения: mepihindeveloper
→ Ссылка
Вот такое регулярное выражение надо использовать: \b([a-z0-9]+)\b(?<!dog|dogs). Объяснение:
\b- границы слов(...)- группа[a-z0-9]- допустимые символы+- один или несколько символов(?<!...)- гарантирует, что данный шаблон не будет совпадать и заканчиваться на текущей позиции в выраженииdog|dogs- исключающие слова, где|- или
Автор решения: Wiktor Stribiżew
→ Ссылка
Используйте границы слов и блок предварительного просмотра вперёд:
\b(?!(?:dog|dogs)\b)\w+
См. пример использования регулярного выражения.
Подробности
\b- граница слова(?!- начало блока предварительного просмотра(?:dog|dogs)- либоdog, либоdogs\b- граница слова
)- конец блока предварительного просмотра\w+- один и более буквоцифровых символов или символов нижнего подчёркиания.
В JavaScript границу слова можно заменить на (?<!\p{Alphabetic}\p{Mark}*|[\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]) / (?![\p{Alphabetic}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]):
/(?<!\p{Alphabetic}\p{Mark}*|[\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}])(?!(?:собака|пёс)(?![\p{Alphabetic}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]))[\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]+/gu
Конечно, всё это лучше записатьв виде переменных:
const lwb = String.raw`(?<!\p{Alphabetic}\p{Mark}*|[\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}])`;
const rwb = String.raw`(?![\p{Alphabetic}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}])`;
const uw = String.raw`[\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]`;
const exceptions = ['собака', 'пёс'];
const regex = new RegExp(`${lwb}(?!(?:${exceptions.join('|')})${rwb})${uw}+`, "gui");
console.log('Собака, пёс, кот и горилла'.match(regex));