2016-05-23 3 views
0

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

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

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

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

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

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

Что произойдет, если их обоих нет? обязано ли присутствовать, а другое отсутствует? – rock321987

+0

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

+0

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

ответ

2

Вы должны использовать отрицательное lookhead, как это:

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

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

Regex Demo

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

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

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

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

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

+0

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

+0

Так что я должен обязательно удалить символ границы слова? –

Смежные вопросы