Комбинация регулярных выражений JavaScript

#javascript #regex

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

Вопрос:

Привет, переполнение стека,

 I have this three regexp:
var regex = new RegExp(/[A-Z] /g); // This is to select only word with CAPS
var regexOk = new RegExp(/[^OK] /g); // This is to select anything beside OK
var regexDmv = new RegExp(/[^DMV] /g); // This is to select anything beside DMV

// And a variable: 
var string = "Let's go to the DMV tomorrow, is that OK? ANSWER ME!";
  

По сути, я хочу выполнить поиск в этой строке, чтобы она возвращала
[‘ОТВЕТ’, ‘Я’]

Кто-нибудь может дать мне предложение?

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

1. [^OK] соответствует всему, что не является O или K . То же самое и с DMV. Вы просто хотите, что после ? ? Если это так, это намного проще, и вы должны спросить об этом.

Ответ №1:

A. Для сопоставления ANSWER и ME отдельно (см. Демонстрацию)

 b(?!DMV|OK)[A-Z] b
  

Это то же (?!DMV|OK)b[A-Z] b самое, что и (вы можете поместить границу открытия b до или после отрицательного прогноза).

Использование Javascript:

 var regex = /b(?!DMV|OK)[A-Z] b/;
var match = regex.exec(string);
if (match != null) {
    result = match[0];
}
  

Как это работает

  • [A-Z] Соответствует слову в верхнем регистре
  • Границы b с каждой стороны заглавных букв гарантируют, что у нас есть целое слово, а не несколько букв, встроенных в другое слово
  • Отрицательный предварительный просмотр (?!DMV|OK) перед словом гарантирует, что слово, которое мы сопоставляем OK , не является ни DMV

B. Для сопоставления ANSWER ME (см. Демонстрацию)

 (?:b(?!DMV|OK)[A-Z] bs*) 
  

Опять же, вы можете переместить открытие b , если вы предпочитаете его перед [A-Z]

В JavaScript:

 var regex = /(?:b(?!DMV|OK)[A-Z] bs*) /;
var match = regex.exec(string);
if (match != null) {
    result = match[0];
} 
  

Как это работает

  • Группа (?:...) без захвата соответствует одному или нескольким словам в верхнем регистре [A-Z] , за которыми следуют необязательные пробельные символы s*
  • Границы b с каждой стороны заглавных букв гарантируют, что у нас есть целое слово, а не несколько букв, встроенных в другое слово
  • Отрицательный предварительный просмотр (?!DMV|OK) перед каждым словом гарантирует, что слово, которое мы сопоставляем OK , не является ни DMV

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

1. Хорошо, но ответ можно улучшить, добавив немного объяснений относительно того, что здесь происходит. Есть какая-то поговорка о человеке и рыбе…

2. @sphanley я работал над этим, когда вы писали комментарий… Выполнено. 🙂 Спасибо.

3. Большое вам спасибо. Я все еще пытаюсь понять ваше объяснение. Но демонстрация действительно полезна.

4. @user122652 Спасибо, рад, что это работает! 🙂 Пожалуйста, обновите вопрос, я добавил два случая: одно регулярное выражение для сопоставления ANSWER и ME отдельно и одно регулярное выражение для сопоставления ANSWER ME

5. Спасибо, определенно полезно. Как мне обновить вопрос?

Ответ №2:

В регулярном выражении нет NOT string оператора. [^OK] означает любой символ, кроме O и K . Вы можете просто сделать

 /ANSWER|ME/
  

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

1. Я на самом деле пытаюсь найти слова, которые имеют все ЗАГЛАВНЫЕ буквы рядом с OK и DMV