Javascript 将字符串转换为RegExp
如何检查JavaScript字符串是否为RegExp格式,然后将其转换为RegExp 我找到了一种使用RegExp的方法,但规则太复杂,无法正确使用Javascript 将字符串转换为RegExp,javascript,regex,Javascript,Regex,如何检查JavaScript字符串是否为RegExp格式,然后将其转换为RegExp 我找到了一种使用RegExp的方法,但规则太复杂,无法正确使用 function str2Regex(str){ var rule = /\/(\\[^\x00-\x1f]|\[(\\[^\x00-\x1f]|[^\x00-\x1f\\\/])*\]|[^\x00-\x1f\\\/\[])+\/([gim]*)/; var match = str.match(rule); return match
function str2Regex(str){
var rule = /\/(\\[^\x00-\x1f]|\[(\\[^\x00-\x1f]|[^\x00-\x1f\\\/])*\]|[^\x00-\x1f\\\/\[])+\/([gim]*)/;
var match = str.match(rule);
return match ? new RegExp(match[1],match[3]) : str;
}
现在我使用的是有效的
/\/(.*)\/(?=[igm]*)([igm]*)/
。最简单的方法,可能也是最正确的方法是使用try/catch:
try {
r = new RegExp(str);
} catch(error) {
// no good
}
当字符串与格式良好的正则表达式不匹配时,将得到一个SyntaxError
如果要测试值类似于已编译正则表达式的字符串(例如“/\b=\b/g”
),可以使用以下函数:
function checkCompiledRegex(str) {
if (str[0]!='/') return false;
var i = str.lastIndexOf('/');
if (i<=0) return false;
try {
new RegExp(str.slice(1, i), str.slice(i+1));
} catch(error) {
return false;
}
return true;
}
函数checkCompiledRegex(str){
如果(str[0]!=“/”)返回false;
变量i=str.lastIndexOf('/');
如果(i最简单的方法,也可能是最正确的方法,是使用try/catch:
try {
r = new RegExp(str);
} catch(error) {
// no good
}
当字符串与格式良好的正则表达式不匹配时,将得到一个SyntaxError
如果要测试值类似于已编译正则表达式的字符串(例如“/\b=\b/g”
),可以使用以下函数:
function checkCompiledRegex(str) {
if (str[0]!='/') return false;
var i = str.lastIndexOf('/');
if (i<=0) return false;
try {
new RegExp(str.slice(1, i), str.slice(i+1));
} catch(error) {
return false;
}
return true;
}
函数checkCompiledRegex(str){
如果(str[0]!=“/”)返回false;
变量i=str.lastIndexOf('/');
如果(我为什么需要检查正则表达式的有效性?这似乎是一个严重的问题。我正在编写一些路由函数,使用一个cfg对象,哪个键是string或regex,值是handlerFn,因为对象键必须是string,所以我必须检测到键是string或regex string,然后将其更改为RegexI。我已经看到了您的编辑。所以lution在像/**/i
这样简单的事情上失败。你真的不应该试图猜测字符串作为正则表达式是否正确,只要让浏览器找到它(即使用try/catch
绕过new RegExp
)。您的方法的另一个问题是正则表达式引擎会发生变化。假设有可能找到一个有效的正则表达式,那么在javascript正则表达式引擎中引入新的正则表达式功能时就不一样了。为什么需要检查正则表达式的有效性?这似乎是一个严重的问题。我正在编写一些路由函数,使用cfg对象,键是string或regex,值是handlerFn,因为对象键必须是string,所以我必须检测到键是string或regex字符串,然后将其更改为regex。我已经看到了您的编辑。您的解决方案在像/**/I
这样简单的问题上失败。您真的不应该尝试猜测字符串是否与regex一样正确,让我们来看看浏览器会找到它(即在newregexp
周围使用try/catch
)。您的方法的另一个问题是正则表达式引擎会发生变化。假设有可能找到一个有效的正则表达式,那么在javascript正则表达式引擎中引入新的正则表达式功能时就不一样了。正则表达式的参数似乎不能使用/和igm。例如:`y.match(new RegExp(“/y/i”))`为空。当您从字符串构建正则表达式时,请删除“/”和修饰符。/y/i
是一个已编译的正则表达式。我知道正则表达式(“\d+”,“igm”),因此我正在搜索正则表达式以从字符串“/\d+/igm”中提取它们。如果正则表达式有“/”,这将不会通过。例如,我们可以使用/(w+)\/(\d+)/来检测匹配的“a/2”,则正则表达式字符串为空“/(w+\ \/(\d+)/”无法传递fnRegExp的参数,它似乎无法使用/和igm。例如:`“y”.match(new RegExp(“/y/i”)`为空。当您从字符串构建正则表达式时,请删除“/”和修饰符。/y/i
是一个已编译的正则表达式。我知道RegExp(“\d+”,“igm”),因此我正在搜索正则表达式以从字符串“/\d+/igm”中提取它们“如果regexp有一个“/”,这将不会通过。例如,我们可以使用/(w+)\/(\d+)/来检测匹配的“a/2”,那么regex字符串是“/(w+)\/(\d+/”,它不能通过fn。”