【问题标题】:Check whether a string matches a regex in JS检查字符串是否匹配 JS 中的正则表达式
【发布时间】:2022-01-18 00:43:51
【问题描述】:

我想用JavaScript(可以用jQuery)做一些客户端验证来检查一个字符串是否匹配正则表达式:

^([a-z0-9]{5,})$

理想情况下,它应该是一个返回 true 或 false 的表达式。

我是 JavaScript 新手,match() 能满足我的需求吗?似乎检查字符串的一部分是否与正则表达式匹配,而不是全部。

【问题讨论】:

  • 你想要一个完整的匹配,还是只是字符串包含一个匹配的子字符串?
  • 完全匹配 - 不是匹配的子字符串。

标签: javascript regex match


【解决方案1】:

如果你想要的只是一个布尔结果,请使用regex.test()

console.log(/^([a-z0-9]{5,})$/.test('abc1')); // false

console.log(/^([a-z0-9]{5,})$/.test('abc12')); // true

console.log(/^([a-z0-9]{5,})$/.test('abc123')); // true

...您可以从您的正则表达式中删除 (),因为您不需要捕获。

【讨论】:

  • 正则表达式中的初始 ^ 在那里有什么作用?
  • @PedroD ^ 暗示开始或开始于
  • 那么你会如何做相反的事情呢? “不以...开头”
  • @stackdave 您是否在使用 Java,而不是 JavaScript?
【解决方案2】:

使用test()方法:

var term = "sample1";
var re = new RegExp("^([a-z0-9]{5,})$");
if (re.test(term)) {
    console.log("Valid");
} else {
    console.log("Invalid");
}

【讨论】:

  • 请注意,带有RegExp 的版本允许将变量值注入到正则表达式字符串中。
  • 必须删除 new RegExp("^([a-z0-9]{5,})$") 中的双引号才能使其正常工作
【解决方案3】:

您也可以使用match()

if (str.match(/^([a-z0-9]{5,})$/)) {
    alert("match!");
}

但是test() 似乎更快,因为您可以阅读here

match()test() 之间的重要区别:

match() 仅适用于字符串,但test() 也适用于整数。

12345.match(/^([a-z0-9]{5,})$/); // ERROR
/^([a-z0-9]{5,})$/.test(12345);  // true
/^([a-z0-9]{5,})$/.test(null);   // false

// Better watch out for undefined values
/^([a-z0-9]{5,})$/.test(undefined); // true

【讨论】:

  • 它与数字一起工作的原因是因为数字被强制转换为字符串,因为它在期望字符串时作为参数给出。我不会依赖这种行为。这取决于您的环境对 test() 的实现。 (匹配失败,因为数字没有match 成员)。如果您想将其与正则表达式一起使用(例如String(123)),我建议您明确地将您的号码转换为字符串。
  • 这里可以使用匹配,但是如果你看一下性能,test 在我们只想验证一个字符串以匹配正则表达式而不是从中提取子字符串时性能要好 30%。跨度>
  • @pmrotule 是的,但是应该在比赛描述之前提到。
  • test 和 match(以及 matchAll)之间最显着的区别是 match 会返回所有匹配子字符串的列表,而 test 只检查是否有。检查javascript.info/regexp-methods 中的正则表达式方法
【解决方案4】:

如果您只想知道您的字符串是否与正则表达式匹配,请使用/youregexp/.test(yourString)

【讨论】:

    【解决方案5】:

    这是一个查找特定 HTML 标记的示例,因此很明显 /someregex/.test() 返回一个布尔值:

    if(/(span|h[0-6]|li|a)/i.test("h3")) alert('true');

    【讨论】:

      【解决方案6】:

      let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
      let regexp = /[a-d]/gi;
      console.log(str.match(regexp));

      【讨论】:

        【解决方案7】:

        const regExpStr = "^([a-z0-9]{5,})$"
        const result = new RegExp(regExpStr, 'g').test("Your string") // here I have used 'g' which means global search
        console.log(result) // true if it matched, false if it doesn't

        【讨论】:

          【解决方案8】:

          试试

           /^[a-z\d]{5,}$/.test(str)
          

          console.log( /^[a-z\d]{5,}$/.test("abc123") );
          
          console.log( /^[a-z\d]{5,}$/.test("ab12") );

          【讨论】:

          • 这个纯代码回答给页面带来了什么新价值?
          • 目前它是最短的解决方案(由于正则表达式的简化)
          【解决方案9】:

          我建议使用 execute 方法,如果不存在匹配则返回 null,否则返回有用的对象。

          let case1 = /^([a-z0-9]{5,})$/.exec("abc1");
          console.log(case1); //null
          
          let case2 = /^([a-z0-9]{5,})$/.exec("pass3434");
          console.log(case2); // ['pass3434', 'pass3434', index:0, input:'pass3434', groups: undefined]
          

          【讨论】:

            【解决方案10】:

            你可以试试这个,它对我有用。

             <input type="text"  onchange="CheckValidAmount(this.value)" name="amount" required>
            
             <script type="text/javascript">
                function CheckValidAmount(amount) {          
                   var a = /^(?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d+)?$/;
                   if(amount.match(a)){
                       alert("matches");
                   }else{
                    alert("does not match"); 
                   }
                }
            </script>
            

            【讨论】:

              【解决方案11】:

              请试试这朵花:

              /^[a-z0-9\_\.\-]{2,20}\@[a-z0-9\_\-]{2,20}\.[a-z]{2,9}$/.test('abc@abc.abc');
              

              是的

              【讨论】:

                猜你喜欢
                • 2022-11-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-02-20
                • 2014-02-02
                • 1970-01-01
                相关资源
                最近更新 更多