Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将字符串转换为RegExp_Javascript_Regex - Fatal编程技术网

Javascript 将字符串转换为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

如何检查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 ? 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。”