#javascript #regex
#javascript #регулярное выражение
Вопрос:
Учитывая строку «AXB», я хотел бы сопоставлять X только тогда, когда A перед X, а B после X. Однако я не хочу, чтобы A или B были в моем возвращенном совпадении.
Я понимаю, что для B это можно сделать так: /X(?=B)/ но я не уверен, есть ли аналогичный способ сделать это для A (до совпадения)?
Спасибо.
Ответ №1:
Используйте группу захвата для захвата значения, а затем обратитесь к group #1
, чтобы получить доступ к вашему совпадению.
/A(X)B/
Пример:
console.log('AXB'.match(/A(X)B/)[1]); //=> 'X'
Комментарии:
1. это вернет как «AXB», так и «X» как совпадение
2. Чарльз, в скобках указана
X
группа to 1 . Вы проверяете группу 1, и если она не установлена, совпадения нет. Смотрите Пример кода в моем ответе, в котором используется то же регулярное выражение.3. @hwnd спасибо hwnd. Хотя это и не встроенный по умолчанию, но самый простой способ обойти.
4. Чарльз, рад помочь.
Ответ №2:
Вот так:
var the_captures = [];
var yourString = 'your_test_string'
var myregex = /A(X)B/g;
var thematch = myregex.exec(yourString);
while (thematch != null) {
// add it to array of captures
the_captures.push(thematch[1]);
document.write(thematch[1],"<br />");
// match the next one
thematch = myregex.exec(yourString);
}
Объяснение
A
соответствует литералуA
(X)
сопоставляетX
и записывает его в группу 1B
МатчиB
- Скрипт возвращает группу 1:
thematch[1]
На других языках
В JavaScript нет поисковых путей или K
. На языках, которые поддерживают это, вы можете напрямую сопоставлять X
без групп захвата:
AKX(?=B)
(используя lokahead иK
, который сообщает движку отбросить то, что было сопоставлено до сих пор, от окончательного соответствия, которое он возвращает)(?<=A)X(?=B)
(с использованием утверждений lookbehind и lookahead)
Комментарии:
1. Я вижу, что происходит сейчас — Js требует реализации для предварительного просмотра.