Как сопоставить отрицательный внешний вид с неизвестными символами между?

#javascript #regex #cypress #negative-lookbehind

#javascript #регулярное выражение #cypress #отрицательный внешний вид

Вопрос:

Мне нужно сопоставить все .get('asfd') , но только в том случае, .wait(.*) когда они не существуют заранее.

 .wait(500).get('asdf') // shouldn't match
.asdf('asdf').get('asdf') // should match
  

К сожалению, отрицательный внешний вид не поддерживает кванторы, поэтому я не уверен, как описать пустоту между .wait( и ).get('asdf') для d*

Каков подход к сопоставлению этой не поддающейся количественному определению области?

Я полагаю, мне нужен какой-то способ описать, что за последним набором круглых скобок не было wait , но есть ли простой способ сделать это?

Спасибо

Ответ №1:

Хорошо, потребовалось довольно много экспериментов, и этот вопрос помог прояснить ситуацию.

Ответ заключается в том, чтобы описать промежуточное: отделить от внешнего вида.

 (?<!wait)
(?:([^)]*))
(.get(.*))
  

Этот второй раздел допускает любой символ до круглой скобки. Иногда первая скобка появляется внутри кавычек, и ее следует игнорировать. Без учета экранированных кавычек все мое регулярное выражение стало:

 ((?<!wait)(.*)s*)(.get((?:"[^"]*"|'[^']*')[^)]*))
  

И я использую его для вставки .wait() до / после .get() с группами соответствия 1 ( $1 ) и 2 ( $2 )

 $1.wait(234)$2.wait(234)
  

введите описание изображения здесь

введите описание изображения здесь

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

1. Не было бы .*(?<!wait)(?:(.*))(.get(.*)) ?

Ответ №2:

Я не эксперт по регулярным выражениям, но как насчет этого?

/^(?!.wait(d )).*.get(.*)/g

Объяснение:

(?! Отрицательный внешний вид.Указывает группу, которая не может совпадать после основного выражения (если оно совпадает, результат отбрасывается).

. Экранированный символ. Соответствует символу «.» (код символа 46).

w Символ. Соответствует символу «w» (код символа 119). Чувствителен к регистру.

a Символ. Соответствует символу «a» (код символа 97). Чувствителен к регистру.

i Символ. Соответствует символу «i» (код символа 105). Чувствителен к регистру.

t Символ. Соответствует символу «t» (код символа 116). Чувствителен к регистру.

( Экранированный символ. Соответствует символу «(» (код символа 40).

d Цифра. Соответствует любому цифровому символу (0-9).

Квантификатор. Сопоставьте 1 или более предыдущих токенов.

) Экранированный символ. Соответствует символу «)» (код символа 41).

. Точка. Соответствует любому символу, кроме разрывов строк.

* Квантификатор. Сопоставьте 0 или более предыдущего токена.

. Экранированный символ. Соответствует символу «.» (код символа 46).

g Символ. Соответствует символу «g» (код символа 103). Чувствителен к регистру.

e Символ. Соответствует символу «e» (код символа 101). Чувствителен к регистру.

t Символ. Соответствует символу «t» (код символа 116). Чувствителен к регистру.

( Экранированный символ. Соответствует символу «(» (код символа 40).

. Точка. Соответствует любому символу, кроме разрывов строк.

* Квантификатор. Сопоставьте 0 или более предыдущего токена.

) Экранированный символ. Соответствует символу «)» (код символа 41).