Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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 从正则表达式文本获取正则表达式字符串表示的最佳方法_Javascript_Regex_Parsing - Fatal编程技术网

Javascript 从正则表达式文本获取正则表达式字符串表示的最佳方法

Javascript 从正则表达式文本获取正则表达式字符串表示的最佳方法,javascript,regex,parsing,Javascript,Regex,Parsing,如果我这样做: // note that \x1f is a control character var regex = new RegExp("\x1f"); // prints "//" console.log(regex.toString()); 如果我这样做: var regex = /\\x1f/; // prints "/\\x1f/" console.log(regex.toString()); 我希望能够从第二个正则表达式中获得第一个结果(/-带控制字符的字符串)。有没

如果我这样做:

// note that \x1f is a control character
var regex = new RegExp("\x1f");

// prints "//"
console.log(regex.toString()); 
如果我这样做:

var regex = /\\x1f/;

// prints "/\\x1f/"
console.log(regex.toString());
我希望能够从第二个正则表达式中获得第一个结果(
/
-带控制字符的字符串)。有没有一个简单的方法可以做到这一点?到目前为止,我只能通过一个恶心的
eval
hack来做到这一点:

var regexValue=/\\x1f/.toString();
让escapedLiteral=regexValue
//将双反斜杠(\\)转换为单反斜杠(\),
.replace(/\\\/g,“\\\”)
//删除开始和结束前斜杠(/)。
//这需要更加智能-如果有标志怎么办?
.切片(1,-1);
//可能存在无效的正则表达式字符串
试一试{
regexValue=eval('newregexp(“+escapedLiteral+”)).toString();
}捕获(e){
regexValue=null;
}
//应打印“/”

文件写入(regexValue)首先,
/\\x1f/
newregexp(“\x1f”)
不同,它是
newregexp(“\\\\x1f”)

其次,如果您正在执行eval hack,您可以将正则表达式的字符串表示形式反馈给eval:

var x = /\x1f/;
console.log(eval(''+x));
第三,有很多JavaScript解析库,比如esprima、espree或babylon。我建议使用其中之一,或者至少研究一下它们的源代码

要快速避免eval黑客攻击,您可以执行以下操作:

var literalStr = "/abc/gi";
var m = /^\/(.*)\/([a-z]*)$/.exec(literalStr);
var regexObj = m ? new RegExp(m[1], m[2]) : null;
console.log(regexObj);
或者


你试过了吗.source?@you它看起来像
。source
给出了与
.toString()
相同的结果。谢谢,我应该意识到我的两个正则表达式是不同的。这就完全不同了。
/\x1f/.toString().replace(/\\x(..)/g, 
   function(a, b) {return a.replace("\\x" + b, String.fromCharCode(b));}
);