Регулярное выражение Javascript — как сопоставить X только тогда, когда A перед X, а B после X

#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 и записывает его в группу 1
  • B Матчи B
  • Скрипт возвращает группу 1: thematch[1]

На других языках

В JavaScript нет поисковых путей или K . На языках, которые поддерживают это, вы можете напрямую сопоставлять X без групп захвата:

  • AKX(?=B) (используя lokahead и K , который сообщает движку отбросить то, что было сопоставлено до сих пор, от окончательного соответствия, которое он возвращает)
  • (?<=A)X(?=B) (с использованием утверждений lookbehind и lookahead)

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

1. Я вижу, что происходит сейчас — Js требует реализации для предварительного просмотра.