#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