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

Check whether a string matches a regex in JS

提问人:Richard 提问时间:7/7/2011 最后编辑:Karl KnechtelRichard 更新时间:5/30/2023 访问量:1422956

问:

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

match()似乎检查字符串的一部分是否与正则表达式匹配,而不是整个内容。它能解决问题吗?我可以调整它来解决问题吗?如何?

JavaScript 正则表达式 匹配

评论

1赞 Kerrek SB 7/7/2011
是想要完全匹配,还是只想要字符串是否包含匹配的子字符串?
2赞 Richard 7/7/2011
完全匹配 - 不是匹配的子字符串。
0赞 Karl Knechtel 1/10/2023
我对问题最初是如何提出的感到困惑。当然,不需要整个字符串与正则表达式匹配。但是 and 锚点确保这个正则表达式只能与整个字符串匹配 - 这就是它们的目的match^$
1赞 Karl Knechtel 1/10/2023
无论如何,相关文档:developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/...

答:

1769赞 user113716 7/7/2011 #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

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

评论

2赞 PedroD 12/2/2016
正则表达式中的首字母^有什么作用?
16赞 Nagaraju 12/7/2016
@PedroD ^ 表示开头或开头
0赞 PedroD 12/7/2016
那么你会如何反其道而行之呢?“不是从......”
0赞 JHH 12/15/2016
@PedroD stackoverflow.com/questions/899422/......
0赞 Mike Smith 5/21/2021
如果我想对这些小组做点什么,我会怎么做?如果没有匹配项,则会给出错误。此外,先运行测试,然后再运行匹配是低效的。
63赞 user278064 7/7/2011 #2

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

25赞 user2449231 9/23/2013 #3

下面是一个查找某些 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
144赞 pmrotule 6/19/2014 #4

您还可以使用: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赞 Bronzdragon 1/20/2019
它之所以对数字起作用,是因为该数字被强制转换为字符串,因为它在需要字符串时作为参数给出。我不会依赖这种行为。这取决于您的环境对 test() 的实现。(匹配失败,因为数字没有成员)。如果您想将您的数字与正则表达式一起使用(例如),我建议将其显式转换为字符串。matchString(123)
0赞 Akansh 2/26/2019
匹配可以在这里使用,但如果你看一下性能,当我们只想验证一个字符串以匹配正则表达式而不是从中提取子字符串时,性能会提高 30%。test
0赞 Akansh 2/26/2019
@pmrotule是的,但在比赛描述之前应该提到。
0赞 Juan Lanus 1/14/2020
test 和 match(以及 matchAll)之间最显着的区别在于,match 会返回所有匹配子字符串的列表,而 test 只检查是否有任何子字符串。检查 javascript.info/regexp-methods 中的正则表达式方法
0赞 Karl Knechtel 1/10/2023
@Bronzdragon这个答案声称它不适用于 ,即使以同样的方式调用。为什么那里不会发生同样的胁迫?matchmatch
260赞 Abhijeet Kasurde 2/16/2015 #5

使用方法:test()

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

评论

8赞 Christophe Roussy 4/4/2016
请注意,允许将变量值注入正则表达式字符串的版本。RegExp
3赞 Facundo Colombier 10/18/2018
必须删除双引号才能使其正常工作new RegExp("^([a-z0-9]{5,})$")
23赞 Mike 3/19/2018 #6

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

4赞 Jaber Alshami 3/18/2019 #7

请试试这朵花:

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

7赞 Kamil Kiełczewski 4/12/2019 #8

尝试

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

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

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

评论

2赞 mickmackusa 6/14/2019
这个纯代码答案为页面带来了什么新价值?
2赞 Kamil Kiełczewski 6/14/2019
目前它是最短的解决方案(由于正则表达式简化)
7赞 Juan 4/25/2019 #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]
6赞 Tongi 2/7/2020 #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>
12赞 Geetanshu Gulati 4/30/2020 #11

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

2赞 Madhusoodan P 4/7/2022 #12

如果你不想在正则表达式周围加上 ^ 和 $(我有这样的用例),你可以做类似的事情

let reg = /[a-zA-Z0-9]+/g
let txt = "hello"
let matches = reg.exec(txt)[0] == txt
console.log(`It ${matches ? "does" : "doesn't"} match`)
1赞 Sufiyan Ansari 5/29/2022 #13

更新/添加

如果 URL 中不存在查询字符串,则以下解决方案将用于在 URL 中添加参数,如果它已经存在,则它将更新。

function updateUrlParameter(url, param, value) {
  var regex = new RegExp("(?<=[?|&])(" + param + "=)[^&]+", "i");
  if (regex.test(url)) {
    return url.replace(regex, param + "=" + value);
  } else {
    if (window.location.search) {
      return `${url}&${param}=${value}`;
    }else{
      return `${url}?${param}=${value}`;
    }
  }
}

0赞 Lovethenakedgun 5/8/2023 #14

调用可能是正确的,但有几个注意事项:RegExp.prototype.test()

  • 它会告诉你一个字符串是否“匹配”一个正则表达式——即它是否“包含匹配的序列”——而不是字符串是否是“完全匹配”。
  • 如果正则表达式是全局的,它实际上存储来自 MDN 的状态:/g

JavaScript RegExp 对象在设置了全局或粘性标志(例如 /foo/g 或 /foo/y)时是有状态的。他们存储了上一场比赛的 lastIndex...https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test

这意味着,对于第一点,您需要使用锚点,其中表示字符串的开始,并指示其结束。因此,与完整字符串“Cat”匹配的正则表达式,没有其他任何东西:^$/^Cat$/

其次,您不能为此目的在同一字符串上重用全局正则表达式,因为它的含义会随着时间的推移而变化。例如(并注意失败,尽管使用了不同的字符串实例)regex.test(str)

reg = /t/g;
console.log(reg.lastIndex); // 0 -- Never run
console.log(reg.test("Cat")); // true -- Matched "t"
console.log(reg.lastIndex); // 3 -- 3rd character was "t"
console.log(reg.test("Cat")); // false -- no more matches!
0赞 InSync 5/30/2023 #15

match()似乎检查字符串的一部分是否与正则表达式匹配,而不是整个内容。它能解决问题吗?我可以调整它来解决问题吗?如何?

是的, 你可以的。 如果您愿意,则不需要^$

这个想法很简单:返回一个“匹配”数组。如果第一个元素(即整个匹配项,或 )等于字符串,那么我们有一个完全匹配项。.match()$0

function fullMatch(string, regex) {
  const match = string.match(regex);
  return match?.[0] === string;
}

尝试一下:

console.config({ maximize: true });

function fullMatch(string, regex) {
  const match = string.match(regex);
  console.log(match);
  return match?.[0] === string;
}

const string = 'f00bar';
const testcases = [
  /\d+c?ba/, // false
  /f\d+\w+/, // true
  /[0a-z]+/g // false
];

testcases.forEach(
  regex => console.log(fullMatch(string, regex))
);
<script src="https://gh-canon.github.io/stack-snippet-console/console.min.js"></script>

请注意,这不适用于正则表达式,因为如果至少有一个匹配项,则此标志会导致始终返回普通数组。g.match()

但是,您可以改用 RegExp#exec():

function fullMatch(string, regex) {
  const match = regex.exec(regex);
  return match?.[0] === string;
}

尝试一下:

console.config({ maximize: true });

function fullMatch(string, regex) {
  const match = regex.exec(string);
  console.log(match);
  return match?.[0] === string;
}

const string = 'f00bar';
const testcases = [
  /\d+c?ba/, // false
  /f\d+\w+/, // true
  /[0a-z]+/g // true
];

testcases.forEach(
  regex => console.log(fullMatch(string, regex))
);
<script src="https://gh-canon.github.io/stack-snippet-console/console.min.js"></script>

单行:

const fullMatch = (string, array) => regex.exec(string)?.[0] === string;