Регулярное выражение для строк, содержащих одну строку и не содержащих другую строку

#ruby-on-rails #regex

#javascript #регулярное выражение #редактор #pcre

Вопрос:

У меня есть следующее регулярное выражение, удобное для сопоставления всех строк, содержащих console.log() или alert() функционирующих в любом файле javascript, открытом в редакторе, поддерживающем PCRE.

 ^.*b(console.log|alert)b.*$
 

Но я сталкиваюсь со многими файлами, содержащими window.alert() строки для оповещения о важных сообщениях, я не хочу их удалять / заменять.

Итак, вопрос о том, как сопоставить регулярное выражение (однострочное регулярное выражение без необходимости частого запуска) со всеми строками, содержащими console.log() и alert() не содержащими word window . Также как избежать круглых скобок (круглых скобок), которые невозможно избежать , чтобы сделать их частью строкового литерала?

Я попытался следовать регулярному выражению, но тщетно:

 ^.*b(console.log|alert)((?!window).)*b.*$
 

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

1. что произойдет, если их обоих там нет? обязательно ли, чтобы один из них присутствовал, а другой отсутствовал?

2. Если обеих строк там нет, то совпадения нет, поскольку это не та строка, которую я хочу заменить / удалить, если window и alert находятся в одной строке, например window.alert() , тогда она не должна совпадать, alert или консоль должна быть там, но в window той же строке не должно присутствовать. Короче говоря, сопоставляйте только строки, имеющие alert() или console.log() и не имеющие window .

3. Можете ли вы уточнить, что вы подразумеваете под этим: «как избежать круглых скобок (круглых скобок), которые невозможно избежать с помощью , чтобы сделать их частью строкового литерала» ? Что именно вам нужно? Нет необходимости экранировать ( и ) в строках, и вы можете экранировать их, используя обратную косую черту в регулярных выражениях.

4. Я попытался точно alert( соответствовать этому же регулярному выражению с помощью ^(?!.*window.).*b(console.log|alert()b.*$ , но, как вы можете видеть здесь, в демонстрационной ссылке, это не работает. regexr.com/3dfls

5. удалить b из последнего ^(?!.*window.).*b(console.log|alert().*$

Ответ №1:

Вы должны использовать отрицательный взгляд, например, так:

 ^(?!.*window.).*b(console.log|alert)b.*$
 

Отрицательный предварительный просмотр будет утверждать, что сопоставление невозможно, если строка window. присутствует.

Демонстрация регулярных выражений

Что касается круглых скобок, вы можете экранировать их с помощью обратной косой черты, но поскольку у вас есть символ границы слова, он не будет совпадать, если вы поместите экранированную круглую скобку, потому что они не являются символами слова.

Метасимвол b — это якорь, подобный каретке и знаку доллара. Он совпадает в позиции, которая называется «границей слов». Это совпадение имеет нулевую длину.

Есть три разные позиции, которые квалифицируются как границы слов:

  • Перед первым символом в строке, если первый символ является символом слова.
  • После последнего символа в строке, если последний символ является символом слова.
  • Между двумя символами в строке, где один является символом слова, а другой не является символом слова.

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

1. Спасибо за ответ, это работает, можете ли вы ответить на мой подвопрос, в какой ситуации скобки не могут быть экранированы обратной косой чертой, и как мне избежать их в таких ситуациях?

2. Они могут быть экранированы с помощью обратной косой черты, но поскольку у вас есть символ границы слова, он не будет совпадать, если вы поместите экранированный paren . Вам нужно будет удалить вторую границу слова.

3. Итак, я должен в обязательном порядке удалить символ границы слова?

4. Если вы хотите сопоставить скобки внутри группы захвата, да.