我有一个要求,其中有一个客户名称文本框,用户可以向搜索客户输入客户名称。并且条件是用户可以添加外卡搜索*在前面或后面的客户名称。客户名称最少应为三个字符。我正在使用Regex来验证用户输入。 现在,如果输入类似于“* aaa *”..我使用以下正则表达式验证此类输入:
[*] {1}([A-Z] | [A-Z] | [0-9]){3} [*] {1}
代码如下:
var str = "*aaa*";
var patt = new RegExp("[*]{1}([a-z]|[A-Z]|[0-9]){3,}[*]{1}");
var res = patt.test(str);
alert(res);
var str = "*aaa***";
var patt = new RegExp("[*]{1}([a-z]|[A-Z]|[0-9]){3,}[*]{1}");
var res = patt.test(str);
alert(res);
var str = "*aaa*$$$$";
var patt = new RegExp("[*]{1}([a-z]|[A-Z]|[0-9]){3,}[*]{1}");
var res = patt.test(str);
alert(res);
现在输入“* aaa *”res即将生效。但对于这种类型的输入也“* aaa **”,“* aaa * $”其comimg为真。这预期因为这些表达式还包含满足正则表达式的部分(* aaa *)。但这些输入(“* aaa **”,* aaa * $ **等)是错误的。
请告诉我我在哪里做错了?正则表达式是否有任何问题或检查错误的方式?
答案 0 :(得分:2)
答案 1 :(得分:1)
字符串*aaa*$$$
包含一段*aaa*
,因此它会产生true
;要匹配整个字符串,您需要在两侧添加锚点。 $
和^
锚点分别断言主题的开始和结束。
此外,您可以通过使用字符类技巧大大简化表达式。 \w
由[0-9a-zA-Z_]
组成,我们只想要下划线,因此我们可以使用与\w
相反的负字符类(\W
)和下划线;我同意,它需要一些精神力量; - )
var str = "*aaa*$";
var patt = /^\*[^\W_]{3,}\*$/;
var res = patt.test(str);
alert(res); // false
或者,您可以将所有角色类合并为一个,如下所示:
[A-Za-z0-9]