我需要验证表单上的某些字段,我需要检查用户是否在通配符(*
)之前或之后输入了至少三个字符。
例如:*ABC
或AB1*
这就是我所拥有的:
var pattern = /^(\*\w{3})|(\w{3}\*)$/;
var matchArray = strInput.match(pattern); // Is this format okay?
if (matchArray == null) {
return false;
}
if (strInput.match(pattern)) {
return true;
}
else {
alert("You must enter at least three characters before or after a wildcard(*)\n For example- *ABC or ABC*");
}
matchArray
包含[*112,*112,]
。 matchArray
有3个组[0]=*112,[1]=*112, [2]= undefined
。
我的分组有问题吗?或者我是否正确添加了OR运算符。
答案 0 :(得分:1)
您的通配符*
必须转义:
/^(\*\w{3})|(\w{3}\*)$/
否则它是量词。
答案 1 :(得分:1)
您需要将\*\w{3}
和\w{3}\*
放入一个捕获组(并在其中包含OR),如下所示:
^\*\w{3}|\w{3}\*$
之前发生的事情是\*\w{3}
或\w{3}\*
实际上与字符串匹配,但每个字符串都在一个单独的Capture Group中。这意味着哪一个匹配也取决于它所存储的捕获组。
所以:
*ABC
将存储在 1st
捕获组中(它与第一个模式匹配,\*\w{3}
)ABC*
将存储在 2nd
捕获群组中(它与第二种模式匹配,\w{3}\*
)答案 2 :(得分:0)
您的交替中有两个捕获组。如果一个匹配,则另一个保持undefined
。你应该使用
^(\*\w{3}|\w{3}\*)$
JS代码
var re = /^(\*\w{3}|\w{3}\*)$/g;
var str = '*ABC';
var m;
while ((m = re.exec(str)) !== null) {
if (m.index === re.lastIndex) {
re.lastIndex++;
}
print(m[0] + "\n" + m[1]);
}
<强> Ideone Demo 强>
var re = /^(\*\w{3}|\w{3}\*)$/;
var str = '*ABC';
var result = str.match(re);
document.writeln(result[0] + '<br>');
document.writeln(result[1] + '<br>');
&#13;