【问题标题】:Best way to get string representation of regex from regex literal从正则表达式文字中获取正则表达式字符串表示的最佳方法
【发布时间】:2016-03-29 22:00:10
【问题描述】:

如果我这样做:

// 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 源代码解析,这种差异使事情变得具有挑战性。

【问题讨论】:

  • 你试过.source吗?
  • @YOU 看起来.source 的结果与.toString() 相同。

标签: javascript regex parsing


【解决方案1】:

首先,/\\x1f/new RegExp("\x1f") 不同,而是new RegExp("\\\\x1f")

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

var x = /\x1f/;
console.log(eval(''+x));

第三,有很多 JavaScript 解析库,例如 esprima、espree 或 babylon。我建议使用其中之一,或者至少研究一下它们的源代码。

要快速避免 eval hack,您可以执行以下操作:

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

【讨论】:

  • 谢谢,我应该意识到我的两个正则表达式不一样。这一切都不同。
【解决方案2】:

或者...

/\x1f/.toString().replace(/\\x(..)/g, 
   function(a, b) {return a.replace("\\x" + b, String.fromCharCode(b));}
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    相关资源
    最近更新 更多