javascript中的正则表达式验证在IE8中失败

javascript中的正则表达式验证在IE8中失败,javascript,regex,internet-explorer-8,Javascript,Regex,Internet Explorer 8,试着用这个 (^AD\\[a-zA-Z]+$)|(^ad\\[a-zA-Z]+$)|(^Ad\\[a-zA-Z]+$) 或 尝试验证AD\loginid或AD\loginid或AD\loginid等字符串 以上regex在regex在线测试仪上运行良好。。 喜欢 或 但当我将其合并到脚本验证中时,以下代码将失败 var lanidRegex = new RegExp("(^AD\\[a-zA-Z]+$)|(^ad\\[a-zA-Z]+$)|(^Ad\\[a-zA-Z]+$)"); alert(

试着用这个

(^AD\\[a-zA-Z]+$)|(^ad\\[a-zA-Z]+$)|(^Ad\\[a-zA-Z]+$)

尝试验证AD\loginid或AD\loginid或AD\loginid等字符串

以上regex在regex在线测试仪上运行良好。。 喜欢 或

但当我将其合并到脚本验证中时,以下代码将失败

var lanidRegex = new RegExp("(^AD\\[a-zA-Z]+$)|(^ad\\[a-zA-Z]+$)|(^Ad\\[a-zA-Z]+$)");
alert(lanidRegex.test("AD\loginid"));
我多次以不同的方式重写了正则表达式,但运气不佳。

我认为您需要:

var lanidRegex = new RegExp("(^AD\\\\[a-zA-Z]+$)|(^ad\\\\[a-zA-Z]+$)|(^Ad\\\\[a-zA-Z]+$)");
一个反斜杠用于将每个反斜杠放入字符串,另一个用于告诉正则表达式该反斜杠在正则表达式中引用

在警报行中,您只需要其中两个:

alert(lanidRegex.test("AD\\loginid"));
(感谢其他回答者注意到这一点。)

替代版本也适用:

var lanidRegex = /(^AD\\[a-zA-Z]+$)|(^ad\\[a-zA-Z]+$)|(^Ad\\[a-zA-Z]+$)/;
我认为你需要:

var lanidRegex = new RegExp("(^AD\\\\[a-zA-Z]+$)|(^ad\\\\[a-zA-Z]+$)|(^Ad\\\\[a-zA-Z]+$)");
一个反斜杠用于将每个反斜杠放入字符串,另一个用于告诉正则表达式该反斜杠在正则表达式中引用

在警报行中,您只需要其中两个:

alert(lanidRegex.test("AD\\loginid"));
(感谢其他回答者注意到这一点。)

替代版本也适用:

var lanidRegex = /(^AD\\[a-zA-Z]+$)|(^ad\\[a-zA-Z]+$)|(^Ad\\[a-zA-Z]+$)/;

问题是
\
在Javascript中有两个用途:它是字符串中的转义前缀,在regexp中也是。因为您使用字符串初始化regexp,所以它执行字符串转义。这将导致regexp中出现一个反斜杠,因此它将转义方括号

相反,请使用regexp文本:

var lanidRegex = /(^AD\\[a-zA-Z]+$)|(^ad\\[a-zA-Z]+$)|(^Ad\\[a-zA-Z]+$)/;
alert(lanidRegex.test("AD\\loginid"));
请注意,您还需要将文本字符串“AD\\loginid”中的反斜杠加倍

使用
i
不区分大小写的修饰符可以大大简化regexp:

var lanidRegex = /^ad\\[a-z]+$/i;
如果您不想在开始时允许
aD
,仍然可以简化:

var lanidRegex = /^(AD|ad|Ad)\\[a-zA-Z]+$/;

您只需要前缀中的替代项,其余的是所有变体所共有的。

问题在于
\
在Javascript中有两个用途:它是字符串中的转义前缀,在regexp中也是。因为您使用字符串初始化regexp,所以它执行字符串转义。这将导致regexp中出现一个反斜杠,因此它将转义方括号

相反,请使用regexp文本:

var lanidRegex = /(^AD\\[a-zA-Z]+$)|(^ad\\[a-zA-Z]+$)|(^Ad\\[a-zA-Z]+$)/;
alert(lanidRegex.test("AD\\loginid"));
请注意,您还需要将文本字符串“AD\\loginid”中的反斜杠加倍

使用
i
不区分大小写的修饰符可以大大简化regexp:

var lanidRegex = /^ad\\[a-z]+$/i;
如果您不想在开始时允许
aD
,仍然可以简化:

var lanidRegex = /^(AD|ad|Ad)\\[a-zA-Z]+$/;
您只需要前缀中的替代项,其余的是所有变体所共有的。

在使用
new RegExp
时,您需要使用两倍的反斜杠(在您的情况下,四倍的反斜杠),因为第一个反斜杠用于转义字符串,第二个反斜杠由正则表达式看到

您的目的是让正则表达式匹配反斜杠
\
,这意味着正则表达式引擎需要看到转义的反斜杠
\\
,这意味着您的字符串需要包含四个反斜杠
“\\\\”
,,您需要使用两倍的反斜杠(在您的例子中,四倍反斜杠)当您使用
new RegExp
时,因为第一个反斜杠用于转义字符串,第二个反斜杠由正则表达式看到


您的目的是让正则表达式匹配反斜杠
\
,这意味着正则表达式引擎需要看到转义的反斜杠
\
,这意味着字符串需要包含四个反斜杠
“\\\\”

您遇到了一些转义问题。首先用/,围绕您的正则表达式模式,它可以处理字符串中的一系列转义问题

var lanidRegex = new RegExp(/(^AD\\[a-zA-Z]+$)|(^ad\\[a-zA-Z]+$)|(^Ad\\[a-zA-Z]+$)/);
其次,您需要转义测试字符串中的\

alert(lanidRegex.test("AD\\loginid"));

您有一些转义问题。首先,在regex模式中使用/,它可以处理字符串中的大量转义问题

var lanidRegex = new RegExp(/(^AD\\[a-zA-Z]+$)|(^ad\\[a-zA-Z]+$)|(^Ad\\[a-zA-Z]+$)/);
其次,您需要转义测试字符串中的\

alert(lanidRegex.test("AD\\loginid"));
这终于奏效了

var lanidRegex = new RegExp("^(AD|ad|Ad)\\\\([a-zA-Z]+$)", "gi");
lanidRegex.test("ad\name")
这终于奏效了

var lanidRegex = new RegExp("^(AD|ad|Ad)\\\\([a-zA-Z]+$)", "gi");
lanidRegex.test("ad\name")
你可以做得更简单

var lanidRegex = new RegExp("^(AD|ad|Ad)\([a-zA-Z]+)$");
var res = lanidRegex.test("AD\loginid");
window.console && console.log(res);
你可以做得更简单

var lanidRegex = new RegExp("^(AD|ad|Ad)\([a-zA-Z]+)$");
var res = lanidRegex.test("AD\loginid");
window.console && console.log(res);

我不知道为什么这不起作用,但我想说,
^(AD|[Aa][d])\[a-zA-Z]+$
是一个更好的regex@JoeFrambach fixed。你可能想试试
alert(“AD\loginid”)
,我想你会感到惊讶。不,OP不想匹配
AD
。我不确定这为什么不起作用,但我会说
^(AD\Aa][d])\\[a-zA-Z]+$
是一个更好的正则表达式@JoeFrambach fixed。您可能想尝试
alert(“AD\loginid”)
,我想您会感到惊讶。不,OP不想匹配
AD
。尝试了没有运气..不适用于alert(lanidRegex.test(“AD\loginid”));@user2770382我解释过,你必须将警报字符串中的斜杠加倍。运气不好..不适用于警报(lanidRegex.test(“AD\loginid”);@user2770382我解释过,你必须将警报字符串中的斜杠加倍。如果你使用regexp文本,你不需要
new regexp()
。如果使用regexp文本,则不需要添加
new regexp()
。添加新的fiddle。适用于Chrome和my IE(不是8)。添加新的fiddle。适用于Chrome和my IE(不是8)。警告:“i”regex选项使搜索大小写不敏感如果您不关心大小写,请使用
/^ad\\\\[a-z]+$/i
。而
g
选项没有任何用处。警告:“i”regex选项使搜索大小写不敏感。如果您不关心大小写,只需使用
/^ad\\\[a-z]+$/i
g
选项没有任何用处。