将字符串(来自用户的输入文本)与正则表达式匹配

时间:2015-05-28 06:08:46

标签: javascript regex

我有一个要求,其中有一个客户名称文本框,用户可以向搜索客户输入客户名称。并且条件是用户可以添加外卡搜索*在前面或后面的客户名称。客户名称最少应为三个字符。我正在使用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 * $ **等)是错误的。

请告诉我我在哪里做错了?正则表达式是否有任何问题或检查错误的方式?

2 个答案:

答案 0 :(得分:2)

^(?:[*]([a-z]|[A-Z]|[0-9]){3,}[*])$

使用锚点^$禁用部分匹配。参见演示。

https://regex101.com/r/tS1hW2/17

答案 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]