如何在JavaScript中检查字符串是否是正确编译的正则表达式?
例如,当您执行以下javascript时,会产生错误。
var regex = new RegExp('abc ([a-z]+) ([a-z]+))');
// produces:
// Uncaught SyntaxError: Invalid regular expression: /abc ([a-z]+) ([a-z]+))/: Unmatched ')'
如何确定字符串是否是有效的正则表达式?
答案 0 :(得分:63)
您可以使用try/catch
和RegExp
构造函数:
var isValid = true;
try {
new RegExp("the_regex_to_test_goes_here");
} catch(e) {
isValid = false;
}
if(!isValid) alert("Invalid regular expression");
答案 1 :(得分:6)
这是一个小函数,用于检查两种类型的正则表达式,字符串或模式的有效性:
function validateRegex(pattern) {
var parts = pattern.split('/'),
regex = pattern,
options = "";
if (parts.length > 1) {
regex = parts[1];
options = parts[2];
}
try {
new RegExp(regex, options);
return true;
}
catch(e) {
return false;
}
}
例如,用户可以同时测试test
和/test/g
。 Here是一个工作小提琴。
答案 2 :(得分:0)
function isRegExp(regExp){
try {
new RegExp(regExp);
} catch(e) {
return false
}
return true
}
ex:
isRegExp(/@(\w+)/g) = true
答案 3 :(得分:0)
此函数可以将'/'char作为正则表达式中的普通char进行处理,并且还考虑在when是通用字符串时进行转义。它将始终返回一个正则表达式,如果不是一个好的正则表达式字符串,则为null。
if(fileExists('*.txt'){
//do something
} else{
//do something
}
} ```
any help will be really appreciated.
答案 4 :(得分:0)
问题已解决,但是如果有人需要定义字符串是有效的 RegExp 还是根本不是 RegExp 。
您可以使用new Function()
并在函数主体中使用try ... catch
和new RegExp()
进行模板化,如上所述。
其中有一段说明:
const isRegExp = (string) => {
try {
return new Function(`
"use strict";
try {
new RegExp(${string});
return true;
} catch (e) {
return false;
}
`)();
} catch(e) {
return false;
}
};
// Here the argument 'simplyString' shall be undefined inside of the function
// Function(...) catches the error and returns false
console.log('Is RegExp valid:', isRegExp('simplyString'));
// Here the argument shall cause a syntax error
// isRegExp function catches the error and returns false
console.log('Is RegExp valid:', isRegExp('string which is not a valid regexp'));
// Here the argument is not a valid RegExp, new RegExp(...) throws an error
// Function(...) catches the error and returns false
console.log('Is RegExp valid:', isRegExp('abc ([a-z]+) ([a-z]+))'));
// Valid RegExp, passed as a string
console.log('Is RegExp valid:', isRegExp('/^[^<>()[\]\\.,;:\s@\"]$/'));
// Valid RegExp, passed as a RegExp object
console.log('Is RegExp valid:', isRegExp(/^[^<>()[\]\\.,;:\s@\"]$/));
// Howewer, the code injection is possible here
console.log('Is RegExp valid:', isRegExp(');console.log("This is running inside of the Function(...) as well"'));
答案 5 :(得分:0)
这里没有一个答案满足我检查字符串是否为其他语言(主要是 php)的有效正则表达式的需要,因为它们要么忽略标志、分隔符或转义特殊字符,所以我制作了自己的函数>
function isValidRegex(s) {
try {
const m = s.match(/^([/~@;%#'])(.*?)\1([gimsuy]*)$/);
return m ? !!new RegExp(m[2],m[3])
: false;
} catch (e) {
return false
}
}
console.log(isValidRegex('abc')) //False
console.log(isValidRegex('/abc/')) //True
console.log(isValidRegex('/ab#\/[c]/ig')) //True
console.log(isValidRegex('@ab#\/[c]@ig')) //Special delimiters: True
console.log(isValidRegex('/ab\/[c/ig')) //False
console.log(isValidRegex('/abc/gig')) //False
你也可以派生出这个函数来将字符串转换为 RegExp 对象
function stringToRegex(s) {
const m = s.match(/^([/~@;%#'])(.*?)\1([gimsuy]*)$/);
return m ? new RegExp(m[2], m[3]) : new RegExp(s);
}
console.log(stringToRegex('abc'))
console.log(stringToRegex('/abc/'))
console.log(stringToRegex('/ab#\/[c]/ig'))
console.log(stringToRegex('@ab#\/[c]@ig'))
try {
console.log(stringToRegex('/ab#\/[c/ig'))
} catch (e) {
console.log('Not a valid regex')
}