正则表达式错误javascript

正则表达式错误javascript,javascript,regex,google-chrome-extension,Javascript,Regex,Google Chrome Extension,我正试图使用background.html(chrome扩展名)中的代码将一个js文件(作为字符串)注入到chrome的选项卡中 错误: setTimeout(chrome.tabs.executeScript(tab.id , {code:'console.log("activetab");(function(a){"use strict";var b=this,c=b.SpeechRecognition||b.webkitSpeechRecognition||b.mozSpeechReco

我正试图使用background.html(chrome扩展名)中的代码将一个js文件(作为字符串)注入到chrome的选项卡中

错误

setTimeout(chrome.tabs.executeScript(tab.id ,
{code:'console.log("activetab");(function(a){"use strict";var 
b=this,c=b.SpeechRecognition||b.webkitSpeechRecognition||b.mozSpeechRecognition|
|b.msSpeechRecognition||b.oSpeechRecognition;if(!c)return 
b.annyang=null,a;var d,e,f=[],g={start:[],error:[],end:[],result:  
[],resultMatch:[],resultNoMatch:[],errorNetwork:[],errorPermissionBlocked:
[],errorPermissionDenied:[]},h=0,i=!1,j="font-weight: bold; color: 
#00f;",k=!1,l=/\s*\((.*?)\)\s*/g,m=/(\(\?:[^)]+\))\?/g,n=/(\
(\?)?:\w+/g,o=/\\*\w+/g,p=/[\-{}\[\]+?.,\\\^$|#]/g,q=function(a){return 
a=a.replace(p,"\\$&").replace(l,"(?:$1)?").replace(n,function(a,b){return b?
a:"([^\\s]+)"}).replace(o,"(.*?)").replace(m,"\\s*$1?\\s*"),new     
gExp("^"+a+"$","i")},r=function(a){var 
b=Array.prototype.slice.call(arguments,1);a.forEach(function(a)
{a.callback.apply(a.context,b)})},s=function()
{t()||b.annyang.init({},!1)},t=function(){return d!==a},u=function(a,c,d)
{f.push({command:a,callback:c,originalPhrase:d}),i&&b.console.log("Command 
successfully loaded: %c"+d,j)};b.annyang={init:function(l,m)
{m=m===a?!0:!!m,d&&d.abort&&d.abort(),d=new 
c,d.maxAlternatives=5,d.continuous="http:"===b.location.protocol,d.lang="en-
US",d.onstart=function(){r(g.start)},d.onerror=function(a)
{switch(r(g.error),a.error){case"network":r(g.errorNetwork);break;case"not-
allowed":case"service-not-allowed":e=!1,r((new Date).getTime()-h<200?
g.errorPermissionBlocked:g.errorPermissionDenied)}},d.onend=function()
{if(r(g.end),e){var a=(new Date).getTime()-h;1e3>a?
setTimeout(b.annyang.start,1e3-a):b.annyang.start()}},d.onresult=function(a)
{if(k)return i&&b.console.log("Speech heard, but annyang is 
paused"),!1;for(var c=a.results[a.resultIndex],d=
[],e=0;e<c.length;e++)d[e]=c[e].transcript;r(g.result,d);for(var 
h,l=0;l<d.length;l++){h=d[l].trim(),i&&b.console.log("Speech recognized: 
%c"+h,j);for(var m=0,n=f.length;n>m;m++){var o=f[m].command.exec(h);if(o)
{var p=o.slice(1);return i&&(b.console.log("command matched: 
%c"+f[m].originalPhrase,j),p.length&&b.console.log("with         
parameters",p)),f[m].callback.apply(this,p),r(g.resultMatch,h,f[m].originalPhras
e,d),!0}}}return r(g.resultNoMatch,d),!1},m&&(f=
[]),l.length&&this.addCommands(l)},start:function(c){k=!1,s(),c=c||
{},e=c.autoRestart!==a?!!c.autoRestart:!0,c.continuous!==a&&
(d.continuous=!!c.continuous),h=(new Date).getTime();try{d.start()}catch(f)
{i&&b.console.log(f.message)}},abort:function()
{e=!1,t&&d.abort()},pause:function(){k=!0},resume:function()
{b.annyang.start()},debug:function(a)
{i=arguments.length>0?!!a:!0},setLanguage:function(a)
{s(),d.lang=a},addCommands:function(a){var c;s();for(var d in 
a)if(a.hasOwnProperty(d))if(c=b[a[d]]||a[d],"function"==typeof 
c)u(q(d),c,d);else{if(!("object"==typeof c&&c.regexp instanceof RegExp))
{i&&b.console.log("Can not register command: %c"+d,j);continue}u(new 
RegExp(c.regexp.source,"i"),c.callback,d)}},removeCommands:function(b)
{return b===a?void(f=[]):(b=Array.isArray(b)?b:
[b],void(f=f.filter(function(a){for(var 
c=0;c<b.length;c++)if(b[c]===a.originalPhrase)return!1;return!0})))},addCallback
:function(c,d,e){if(g[c]!==a){var f=b[d]||d;"function"==typeof 
f&&g[c].push({callback:f,context:e||this})}}}}).call(this);if(annyang)
{console.log("hi");annyang.start()}'}, null),400);
未捕获的语法错误:无效的正则表达式:/(?)?:w+/:无效组

代码

setTimeout(chrome.tabs.executeScript(tab.id ,
{code:'console.log("activetab");(function(a){"use strict";var 
b=this,c=b.SpeechRecognition||b.webkitSpeechRecognition||b.mozSpeechRecognition|
|b.msSpeechRecognition||b.oSpeechRecognition;if(!c)return 
b.annyang=null,a;var d,e,f=[],g={start:[],error:[],end:[],result:  
[],resultMatch:[],resultNoMatch:[],errorNetwork:[],errorPermissionBlocked:
[],errorPermissionDenied:[]},h=0,i=!1,j="font-weight: bold; color: 
#00f;",k=!1,l=/\s*\((.*?)\)\s*/g,m=/(\(\?:[^)]+\))\?/g,n=/(\
(\?)?:\w+/g,o=/\\*\w+/g,p=/[\-{}\[\]+?.,\\\^$|#]/g,q=function(a){return 
a=a.replace(p,"\\$&").replace(l,"(?:$1)?").replace(n,function(a,b){return b?
a:"([^\\s]+)"}).replace(o,"(.*?)").replace(m,"\\s*$1?\\s*"),new     
gExp("^"+a+"$","i")},r=function(a){var 
b=Array.prototype.slice.call(arguments,1);a.forEach(function(a)
{a.callback.apply(a.context,b)})},s=function()
{t()||b.annyang.init({},!1)},t=function(){return d!==a},u=function(a,c,d)
{f.push({command:a,callback:c,originalPhrase:d}),i&&b.console.log("Command 
successfully loaded: %c"+d,j)};b.annyang={init:function(l,m)
{m=m===a?!0:!!m,d&&d.abort&&d.abort(),d=new 
c,d.maxAlternatives=5,d.continuous="http:"===b.location.protocol,d.lang="en-
US",d.onstart=function(){r(g.start)},d.onerror=function(a)
{switch(r(g.error),a.error){case"network":r(g.errorNetwork);break;case"not-
allowed":case"service-not-allowed":e=!1,r((new Date).getTime()-h<200?
g.errorPermissionBlocked:g.errorPermissionDenied)}},d.onend=function()
{if(r(g.end),e){var a=(new Date).getTime()-h;1e3>a?
setTimeout(b.annyang.start,1e3-a):b.annyang.start()}},d.onresult=function(a)
{if(k)return i&&b.console.log("Speech heard, but annyang is 
paused"),!1;for(var c=a.results[a.resultIndex],d=
[],e=0;e<c.length;e++)d[e]=c[e].transcript;r(g.result,d);for(var 
h,l=0;l<d.length;l++){h=d[l].trim(),i&&b.console.log("Speech recognized: 
%c"+h,j);for(var m=0,n=f.length;n>m;m++){var o=f[m].command.exec(h);if(o)
{var p=o.slice(1);return i&&(b.console.log("command matched: 
%c"+f[m].originalPhrase,j),p.length&&b.console.log("with         
parameters",p)),f[m].callback.apply(this,p),r(g.resultMatch,h,f[m].originalPhras
e,d),!0}}}return r(g.resultNoMatch,d),!1},m&&(f=
[]),l.length&&this.addCommands(l)},start:function(c){k=!1,s(),c=c||
{},e=c.autoRestart!==a?!!c.autoRestart:!0,c.continuous!==a&&
(d.continuous=!!c.continuous),h=(new Date).getTime();try{d.start()}catch(f)
{i&&b.console.log(f.message)}},abort:function()
{e=!1,t&&d.abort()},pause:function(){k=!0},resume:function()
{b.annyang.start()},debug:function(a)
{i=arguments.length>0?!!a:!0},setLanguage:function(a)
{s(),d.lang=a},addCommands:function(a){var c;s();for(var d in 
a)if(a.hasOwnProperty(d))if(c=b[a[d]]||a[d],"function"==typeof 
c)u(q(d),c,d);else{if(!("object"==typeof c&&c.regexp instanceof RegExp))
{i&&b.console.log("Can not register command: %c"+d,j);continue}u(new 
RegExp(c.regexp.source,"i"),c.callback,d)}},removeCommands:function(b)
{return b===a?void(f=[]):(b=Array.isArray(b)?b:
[b],void(f=f.filter(function(a){for(var 
c=0;c<b.length;c++)if(b[c]===a.originalPhrase)return!1;return!0})))},addCallback
:function(c,d,e){if(g[c]!==a){var f=b[d]||d;"function"==typeof 
f&&g[c].push({callback:f,context:e||this})}}}}).call(this);if(annyang)
{console.log("hi");annyang.start()}'}, null),400);
setTimeout(chrome.tabs.executeScript(tab.id、,
{code:'console.log(“activetab”);(函数(a){“使用严格”;var
b=这个,c=b.语音识别| | b.webkitSpeechRecognition | | b.mozSpeechRecognition|
|b、 mspeechrecognition | b.oSpeechRecognition;如果(!c)返回
b、 annyang=null,a;变量d,e,f=[],g={开始:[],错误:[],结束:[],结果:
[],结果匹配:[],结果匹配:[],错误网络:[],错误许可被阻止:
[],errorPermissionDenied:[]},h=0,i=!1,j=“font-weight:bold;颜色:
#00f;“,k=!1,l=/\s*\(.*?\)\s*/g,m=/(\(\?:[^)]+\)\?/g,n=/(\
(\?)?:\w+/g,o=/\*\w+/g,p=/[\-{}\[\]+?,\\^$\\\\]/g,q=函数(a){return
a=a.replace(p,“\\$&”).replace(l,“(?:$1)?”).replace(n,函数(a,b){返回b?
a:“([^\\s]+)”}).替换(o,“(.*)”).替换(m,“\\s*$1?\\s*”),新的
gExp(“^”+a+“$”,“i”)},r=函数(a){var
b=Array.prototype.slice.call(参数,1);a.forEach(函数(a)
{a.callback.apply(a.context,b)}},s=function()
{t()| | b.annyang.init({},!1)},t=function(){return d!==a},u=function(a,c,d)
{f.push({command:a,callback:c,originalPhrase:d}),i&&b.console.log(“command
已成功加载:%c“+d,j)};b.annyang={init:function(l,m)
{m=m==a?!0:!!m,d&&d.abort&&d.abort(),d=new
c、 d.maxAlternations=5,d.continuous=“http:”==b.location.protocol,d.lang=“en-
US“,d.onstart=function(){r(g.start)},d.onerror=function(a)
{switch(r(g.error),a.error){case“network”:r(g.errorNetwork);break;case“not”-
允许”:case“不允许服务”:e=!1,r((新日期).getTime()-ha?
setTimeout(b.annyang.start,1e3-a):b.annyang.start()},d.onresult=函数(a)
{if(k)返回i&&b.console.log(“听到了语音,但annyang是
暂停”),!1;for(var c=a.results[a.resultIndex],d=
[],e=0;e0?!!a:!0},setLanguage:function(a)
{s(),d.lang=a},addCommands:function(a){var c;s();for(var d in
a) 如果(a.hasOwnProperty(d))如果(c=b[a[d]| | a[d],“函数”==typeof
c) u(q(d),c,d);else{if(!((“object”==c的类型和c.regexp的实例regexp))
{i&&b.console.log(“无法注册命令:%c”+d,j);continue}u(新
RegExp(c.RegExp.source,“i”),c.callback,d)},removeCommands:function(b)
{return b==a?void(f=[]):(b=Array.isArray(b)?b:
[b] ,void(f=f.filter(函数(a){for(var

c=0;c如果按原样运行示例代码,则正则表达式转义的是换行符,而不是打开的paren。
(这是混淆的代价)

这个

(\
(\?)?:\w+
解析成这个

=    (  <-- Unbalanced  '('
          \n
          ( \? )?                            # (1)
          : \w+ 
 ( \(\? )?                     # (1)
 : \w+  
=    (  <-- Unbalanced  '('
          (                                  # (1 start)
=              ?  <-- Quantifies nothing
          )?                                 # (1 end)
          :w+
这就解释了

=    (  <-- Unbalanced  '('
          \n
          ( \? )?                            # (1)
          : \w+ 
 ( \(\? )?                     # (1)
 : \w+  
=    (  <-- Unbalanced  '('
          (                                  # (1 start)
=              ?  <-- Quantifies nothing
          )?                                 # (1 end)
          :w+

但是,您会注意到错误文本中去掉了转义

这是什么

这就解释了这一点

=    (  <-- Unbalanced  '('
          \n
          ( \? )?                            # (1)
          : \w+ 
 ( \(\? )?                     # (1)
 : \w+  
=    (  <-- Unbalanced  '('
          (                                  # (1 start)
=              ?  <-- Quantifies nothing
          )?                                 # (1 end)
          :w+

取代那些现有的行。

如果您想匹配
转义它,
/(\?)?:w+/
详细介绍了您需要在正则表达式中转义的字符。要点是某些字符对正则表达式有特殊意义,如果您不转义它们,它们可能导致不需要的字符(例如点()将匹配任何字符,而不仅仅是点(如果不是转义的话)行为或导致语法错误。