如果我这样做:
// 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();
let escapedLiteral = regexValue
// turn double backslashes (\\) into single backslashes (\),
.replace(/\\\\/g, '\\')
// remove the opening and closing forward slashes (/).
// this needs to be more intelligent - what if there are flags?
.slice(1, -1);
// there could be an invalid regular expression string
try {
regexValue = eval('new RegExp("' + escapedLiteral + '")').toString();
} catch (e) {
regexValue = null;
}
// should print "//"
document.writeln(regexValue);

我正在进行一些JavaScript源代码解析,这种差异使得事情变得充满挑战。
答案 0 :(得分:1)
首先,/\\x1f/
与new RegExp("\x1f")
不同,而是new RegExp("\\\\x1f")
。
其次,如果你正在进行eval hack,你可以将正则表达式的字符串表示反馈给eval:
var x = /\x1f/;
console.log(eval(''+x));
第三,有许多JavaScript解析库,如esprima,espree或babylon。我建议使用其中一个,或者至少研究它们的源代码。
要快速避免评估错误,您可以执行以下操作:
var literalStr = "/abc/gi";
var m = /^\/(.*)\/([a-z]*)$/.exec(literalStr);
var regexObj = m ? new RegExp(m[1], m[2]) : null;
console.log(regexObj);
答案 1 :(得分:0)
或......
/\x1f/.toString().replace(/\\x(..)/g,
function(a, b) {return a.replace("\\x" + b, String.fromCharCode(b));}
);