Javascript 包含一个字符串但不包含另一个字符串的行的正则表达式
我手头有以下正则表达式,可以匹配在支持PCRE的编辑器中打开的任何javascript文件中包含Javascript 包含一个字符串但不包含另一个字符串的行的正则表达式,javascript,regex,editor,pcre,Javascript,Regex,Editor,Pcre,我手头有以下正则表达式,可以匹配在支持PCRE的编辑器中打开的任何javascript文件中包含console.log()或alert()函数的所有行 ^.*\b(console\.log|alert)\b.*$ 但是我遇到许多文件包含用于提醒重要消息的window.alert()行,我不想删除/替换它们 因此,问题是如何将包含console.log()和alert()但不包含wordwindow的所有行与正则表达式匹配(单行正则表达式,无需频繁运行)。另外,如何对\无法回避的圆括号(括号)进
console.log()
或alert()
函数的所有行
^.*\b(console\.log|alert)\b.*$
但是我遇到许多文件包含用于提醒重要消息的window.alert()
行,我不想删除/替换它们
因此,问题是如何将包含console.log()
和alert()
但不包含wordwindow
的所有行与正则表达式匹配(单行正则表达式,无需频繁运行)。另外,如何对\
无法回避的圆括号(括号)进行转义,使其成为字符串文字的一部分
我试着遵循正则表达式,但没有成功:
^.*\b(console\.log|alert)((?!window).)*\b.*$
您应该使用一个负面的lookhead,如下所示:
^(?!.*window\.).*\b(console\.log|alert)\b.*$
如果字符串窗口存在,则负lookhead将断言不可能匹配
至于括号,可以用反斜杠转义,但是因为有单词边界字符,所以如果放转义括号,它将不匹配,因为它们不是单词字符
元字符\b是一个锚点,类似于插入符号和美元符号。
它在称为“单词边界”的位置匹配。这场比赛
长度为零
有三种不同的位置可以作为单词边界:
- 如果字符串中的第一个字符是
单词字符李>
- 在字符串中的最后一个字符之后,如果
字符是一个单词字符李>
- 在字符串中的两个字符之间,
其中一个是单词字符,另一个不是单词字符
您应该使用一个负面的lookhead,如下所示:
^(?!.*window\.).*\b(console\.log|alert)\b.*$
如果字符串窗口存在,则负lookhead将断言不可能匹配
至于括号,可以用反斜杠转义,但是因为有单词边界字符,所以如果放转义括号,它将不匹配,因为它们不是单词字符
元字符\b是一个锚点,类似于插入符号和美元符号。
它在称为“单词边界”的位置匹配。这场比赛
长度为零
有三种不同的位置可以作为单词边界:
- 如果字符串中的第一个字符是
单词字符李>
- 在字符串中的最后一个字符之后,如果
字符是一个单词字符李>
- 在字符串中的两个字符之间,
其中一个是单词字符,另一个不是单词字符
如果他们两个都不在那里怎么办?一个字符串必须存在,另一个字符串必须不存在吗?如果两个字符串都不存在,那么就没有匹配项,因为这不是我要回复/删除的行,如果window
和alert
都在同一行,如window.alert()
那么它不应该匹配,所以警报
或控制台应该在那里,但在同一行窗口
中不应该出现。简言之,只匹配具有alert()
或console.log()
且不具有窗口的行。您能否详细说明一下您的意思:“如何转义不可由\分隔的圆括号(括号),使其成为字符串文字的一部分”?你到底需要什么?无需在字符串中转义(
和)
,您可以在正则表达式中使用反斜杠来转义它们。我尝试通过^(?!window\)..\b(console\.log | alert\()\b.*
在同一正则表达式中精确匹配警报(
),但正如您在演示链接中看到的,它不起作用。从上一个中删除\b
^(?!*window\).*\b(console\.log | alert\()$
如果两者都不存在会发生什么?是否必须有一个字符串存在,另一个不存在?如果两个字符串都不存在,那么就没有匹配项,因为它不是我要回复/删除的行,如果window
和alert
都在同一行,如window.alert()
那么它不应该匹配,所以警报
或控制台应该在那里,但在同一行中窗口
不应该存在。简而言之,只匹配具有警报()
或控制台.log()
且没有窗口
的行。您能详细说明一下这句话的意思吗:“如何转义圆括号(括号))如果要使它们成为字符串文字的一部分,\,它们是不可逃避的?您到底需要什么?不需要在字符串中转义(
和)
,您可以在正则表达式中使用反斜杠来转义它们。我试图通过^(?!window\)在同一正则表达式中完全匹配警报(
).\b(控制台\.log |警报)()\b、 *$
,但正如您在演示链接中看到的,它不起作用。请从上一个^(?。*窗口\.)中删除\b
。\b(控制台\.log |警报\)().*$
谢谢你的回答,它很有效,你能回答我的子问题吗?在什么情况下,括号不能用反斜杠转义,在这些情况下,我应该如何转义?可以用反斜杠转义,但因为你有一个单词边界字符,如果你放了转义的参数,它将不匹配。你必须删除它第二个单词边界。所以我必须强制删除单词边界字符?如果你想匹配捕获组中的paren,是的。谢谢你的回答,它可以工作,你能回答我的子问题吗?在什么情况下括号不能用反斜杠转义,在那些情况下我应该如何转义?它们可以是esc带反斜杠的类人猿,但由于您有一个单词边界字符,如果您放置转义的paren,它将不匹配。您必须删除第二个单词边界。因此,我必须强制删除单词边界字符?如果您要匹配捕获组中的paren,可以。