【问题标题】:Match a string(input text from user) with regular expression将字符串(来自用户的输入文本)与正则表达式匹配
【发布时间】:2015-05-28 15:37:01
【问题描述】:

我有一个要求,其中有一个客户名称文本框,并且用户能够输入客户名称来搜索客户。条件是用户可以在客户名称前面或后面添加 * 通配符搜索。并且客户名称的长度至少应为三个字符。我正在使用正则表达式来验证用户条目。 现在,如果输入类似于“*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*$”也是如此。这是预期的,因为这些表达式还包含满足正则表达式的部分(*aaa*)。但是这些输入(“*aaa**”,*aaa*$** 等)是错误的。

请让我知道我做错了什么?正则表达式是否有问题或检查方式有误?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:
    ^(?:[*]([a-z]|[A-Z]|[0-9]){3,}[*])$
    

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

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

    【讨论】:

    • 你能解释一下你做了什么改变...... ^$ 这些你使用了,以便整个字符串与正则表达式匹配。但是你为什么用过?:
    • @Sambuddha 当你不使用^$ 时,正则表达式会进行部分匹配。从*aaa** 它将匹配*aaa* 并通过。当你添加锚时它不会,除非匹配完整的字符串
    • 我猜^[*][a-zA-Z0-9]{3,}[*]$ 是编写此正则表达式的更好方法。使用i 选项,它甚至更短:/^[*][a-z0-9]{3,}[*]$/i
    【解决方案2】:

    字符串*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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 2013-10-18
      • 2022-01-17
      • 2016-11-15
      相关资源
      最近更新 更多