【问题标题】:Regex for lines containing one string and not containing another string包含一个字符串但不包含另一个字符串的行的正则表达式
【发布时间】:2016-05-23 15:04:42
【问题描述】:

我有以下正则表达式可以方便地匹配在支持 PCRE 的编辑器中打开的任何 javascript 文件中包含 console.log()alert() 函数的所有行。

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

但我遇到许多包含window.alert() 行的文件,用于提醒重要消息,我不想删除/替换它们。

所以问题是如何正则表达式匹配(单行正则表达式,无需频繁运行)包含console.log()alert() 但不包含单词window 的所有行。还有如何转义 \ 无法转义的圆括号(括号),使它们成为字符串文字的一部分?

我尝试了以下正则表达式但徒劳无功:

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

【问题讨论】:

  • 如果他们两个都不在会发生什么?是否必须一个人在场而​​另一个人不在场?
  • 如果两个字符串都不存在,则不匹配,因为它不是我要替换/删除的行,如果 windowalert 都在同一行,如 window.alert() 那么它不应该匹配,所以 alert 或控制台应该在那里,但在同一行 window 不应该出现。简而言之,仅匹配具有alert()console.log() 而没有window 的行。
  • 您能否详细说明您的意思:“如何转义 \ 无法转义的圆括号(括号),使其成为字符串文字的一部分”?你到底需要什么?无需在字符串中转义 (),您可以在正则表达式中使用反斜杠来转义它们。
  • 我试图通过^(?!.*window\.).*\b(console\.log|alert\()\b.*$ 在同一个正则表达式中完全匹配alert(,但正如您在演示链接中看到的那样,它不起作用。 regexr.com/3dfls
  • 从最后一个^(?!.*window\.).*\b(console\.log|alert\().*$中删除\b

标签: javascript regex editor pcre


【解决方案1】:

你应该使用负面的lookhead,像这样:

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

如果字符串window. 存在,否定的lookhead 将断言不可能匹配。

Regex Demo

关于括号,你可以用反斜杠转义它们,但是因为你有一个单词边界字符,如果你把转义的括号放在不匹配,因为它们不是单词字符。

元字符 \b 是类似于插入符号和美元符号的锚。 它在称为“单词边界”的位置匹配。这场比赛 长度为零。

有资格作为单词边界的三个不同位置:

  • 在字符串的第一个字符之前,如果第一个字符是 字字符。
  • 在字符串的最后一个字符之后,如果最后一个 字符是一个单词字符。
  • 在字符串中的两个字符之间, 其中一个是单词字符,另一个不是单词字符。

【讨论】:

  • 感谢您的回答,它有效,您能回答我的子问题吗?在什么情况下括号不能被反斜杠转义,在这些情况下我应该如何转义它们?
  • 它们可以用反斜杠转义,但是因为你有一个单词边界字符,如果你把转义的paren放在它上面就不会匹配。您必须删除第二个单词边界。
  • 所以我必须强制删除单词边界字符?
  • 如果你想匹配捕获组内的括号,是的。
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多