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

时间:2016-03-29 22:00:11

标签: 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());

我希望能够从第二个正则表达式获得第一个结果(// - 一个带控制字符的字符串)。有一个简单的方法吗?到目前为止,我只能通过令人作呕的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源代码解析,这种差异使得事情变得充满挑战。

2 个答案:

答案 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));}
);