#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/3dfls5. удалить
b
из последнего^(?!.*window.).*b(console.log|alert().*$
Ответ №1:
Вы должны использовать отрицательный взгляд, например, так:
^(?!.*window.).*b(console.log|alert)b.*$
Отрицательный предварительный просмотр будет утверждать, что сопоставление невозможно, если строка window.
присутствует.
Демонстрация регулярных выражений
Что касается круглых скобок, вы можете экранировать их с помощью обратной косой черты, но поскольку у вас есть символ границы слова, он не будет совпадать, если вы поместите экранированную круглую скобку, потому что они не являются символами слова.
Метасимвол b — это якорь, подобный каретке и знаку доллара. Он совпадает в позиции, которая называется «границей слов». Это совпадение имеет нулевую длину.
Есть три разные позиции, которые квалифицируются как границы слов:
- Перед первым символом в строке, если первый символ является символом слова.
- После последнего символа в строке, если последний символ является символом слова.
- Между двумя символами в строке, где один является символом слова, а другой не является символом слова.
Комментарии:
1. Спасибо за ответ, это работает, можете ли вы ответить на мой подвопрос, в какой ситуации скобки не могут быть экранированы обратной косой чертой, и как мне избежать их в таких ситуациях?
2. Они могут быть экранированы с помощью обратной косой черты, но поскольку у вас есть символ границы слова, он не будет совпадать, если вы поместите экранированный paren . Вам нужно будет удалить вторую границу слова.
3. Итак, я должен в обязательном порядке удалить символ границы слова?
4. Если вы хотите сопоставить скобки внутри группы захвата, да.