在JS中检查字符串是否与正则表达式匹配

1150

我希望使用JavaScript(也可以使用jQuery)来检查一个字符串是否匹配正则表达式^([a-z0-9]{5,})$,并且得到truefalse的结果。

match()看起来是用来检查部分字符串是否匹配正则表达式,而不是整个字符串。它能解决这个问题吗?我能否通过修改适应它来解决这个问题?如何实现?


1
你是想要完全匹配,还是只需要判断字符串是否包含匹配的子串? - Kerrek SB
2
完全匹配 - 不是匹配子字符串。 - Richard
我对问题最初的表述感到困惑。确实,match不需要整个字符串与正则表达式匹配。但是,^$锚点确保此正则表达式只能可能与整个字符串匹配 - 这就是它们的目的 - Karl Knechtel
1
无论如何,相关文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions - Karl Knechtel
15个回答

1769

如果你只想得到布尔值结果,请使用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

如果您不需要捕获任何内容,则可以从正则表达式中删除()


2
正则表达式中的初始符号^有什么作用? - PedroD
16
@PedroD ^ 意味着开始或以...开头。 - Nagaraju
那么你要如何实现相反的功能呢?“不以……开头”。 - PedroD
@PedroD https://dev59.com/W3NA5IYBdhLWcg3wmfEa@PedroD https://dev59.com/W3NA5IYBdhLWcg3wmfEa正则表达式:匹配不以某个序列开头的字符串 - JHH
如果我想对这些组进行操作,我该怎么办?如果没有匹配项,它会报错。此外,先运行测试,然后再运行匹配将是低效的。 - Mike Smith
@MikeSmith...然后运行匹配,并检查是否有匹配项? - Karl Knechtel

260

使用test()方法:

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

8
请注意,使用RegExp的版本允许将变量值注入到正则表达式字符串中。 - Christophe Roussy
3
为使其正常工作,必须移除 new RegExp("^([a-z0-9]{5,})$") 中的双引号。 - Facundo Colombier

144
你也可以使用match()
if (str.match(/^([a-z0-9]{5,})$/)) {
    alert("match!");
}

但是正如您可以在这里读到的那样,test()似乎更快。

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

3
它之所以能与数字一起使用,是因为该数字被强制转换为字符串,因为它作为参数给出时期望的是一个字符串。我不会依赖这种行为。这取决于您的环境对test()的实现。(match失败是因为数字没有'match'成员)。如果您想要将数字与正则表达式一起使用,我建议显式将其转换为字符串(例如String(123))。 - Bronzdragon
可以在这里使用match,但是如果考虑性能,当我们只想验证一个字符串是否匹配正则表达式而不从中提取子字符串时,test的性能要好30%。 - Akansh
@pmrotule 是的,但应该在比赛描述之前提到。 - Akansh
@Bronzdragon这个答案声称它与match不兼容,即使match的调用方式相同。为什么这里不会发生相同的强制转换呢? - Karl Knechtel
@KarlKnechtel 因为match不是Number的原型函数,所以您需要先将其转换为字符串。 - pmrotule
显示剩余2条评论

63

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


25

以下是一个示例,它查找特定的HTML标签,以便清楚地说明/someregex/.test()返回布尔值:

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

记得对于整个字符串的精确匹配,如果您想测试字符串的完全匹配,请在开头使用^并在结尾处使用$

例如:

/[a-z]+/.test('aaa111'); // true
/^[a-z]+$/.test('aaa111'); // false

23

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


12

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


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

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

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


2
这段仅包含代码的答案为页面带来了什么新价值? - mickmackusa
2
目前这是最短的解决方案(由于正则表达式简化)。 - Kamil Kiełczewski

7
我建议使用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]

6

你可以尝试这个方法,对我有效。

 <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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接