提问人:Richard 提问时间:7/7/2011 最后编辑:Karl KnechtelRichard 更新时间:5/30/2023 访问量:1422956
检查字符串是否与JS中的正则表达式匹配
Check whether a string matches a regex in JS
问:
我想使用JavaScript(我也可以使用jQuery)来检查字符串是否与正则表达式匹配,并得到一个或结果。^([a-z0-9]{5,})$
true
false
match()
似乎检查字符串的一部分是否与正则表达式匹配,而不是整个内容。它能解决问题吗?我可以调整它来解决问题吗?如何?
答:
如果你想要的只是一个布尔结果,请使用 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
...您可以从正则表达式中删除它,因为您不需要捕获。()
评论
如果您只想知道字符串是否与正则表达式匹配,请使用。/youregexp/.test(yourString)
下面是一个查找某些 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
您还可以使用: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
评论
match
String(123)
test
match
match
使用方法: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,})$")
let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
let regexp = /[a-d]/gi;
console.log(str.match(regexp));
请试试这朵花:
/^[a-z0-9\_\.\-]{2,20}\@[a-z0-9\_\-]{2,20}\.[a-z]{2,9}$/.test('[email protected]');
真
尝试
/^[a-z\d]{5,}$/.test(str)
console.log( /^[a-z\d]{5,}$/.test("abc123") );
console.log( /^[a-z\d]{5,}$/.test("ab12") );
评论
我建议使用 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]
你可以试试这个,它对我有用。
<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>
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
如果你不想在正则表达式周围加上 ^ 和 $(我有这样的用例),你可以做类似的事情
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`)
更新/添加
如果 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}`;
}
}
}
调用可能是正确的,但有几个注意事项: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!
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;
评论
match
^
$