【问题标题】:Why does unescaping a string mess up my regex?为什么取消转义字符串会弄乱我的正则表达式?
【发布时间】:2012-02-14 14:01:39
【问题描述】:

我正在尝试生成与此类似的 javascript 代码

function ParseJsonDate(input) {
    var tmp = +input.replace(/\/Date\((-?\d+)\)\//, '$1');
    jsonDate = new Date(tmp);

    return jsonDate;
}

在脚本#中我写了这个:

    public static Date ParseJsonDate(string input)
    {
        string pattern = @"/\/Date\((-?\d+)\)\//".Unescape();
        RegularExpression regex = new RegularExpression(pattern);
        string tmp = input.ReplaceRegex(regex, "$1");
        Number milliseconds = Number.Parse(tmp);
        Date jsonDate = new Date(milliseconds);
        return jsonDate;
    }

编译成这样:

StringFunctions.parseJsonDate = function StringFunctions$parseJsonDate(input) {
    /// <param name="input" type="String">
    /// </param>
    /// <returns type="Date"></returns>
    var pattern = unescape('/\\/Date\\((-?\\d+)\\)\\//');
    var regex = new RegExp(pattern);
    var tmp = input.replace(regex, '$1');
    var milliseconds = Number.parse(tmp);
    var jsonDate = new Date(milliseconds);
    return jsonDate;
}

这看起来不错,但是当我使用调试器单步执行时,从非转义字符串构造的 RegExp 对象完全不同。

有什么想法吗?

【问题讨论】:

    标签: javascript regex escaping script#


    【解决方案1】:

    /\/Date\((-?\d+)\)\// 中,前导和尾随/ 不是正则表达式的一部分,它们是正则表达式文字的分隔符。它们告诉 JavaScript 解释器正则表达式的开始和结束位置,就像引号分隔字符串文字一样。

    在 Script# 代码中,您正在以字符串文字的形式创建正则表达式,而不是正则表达式文字。编译器认为前导和尾随 / 旨在匹配文字斜杠。随着那些消失,不应该有任何需要逃避正则表达式中的文字斜线。剩下的就是:

    @"/Date\((-?\d+)\)/"
    

    具有讽刺意味的是,这个正则表达式匹配一个以/ 开头和结尾的字符串。那是你的意图,不是吗?

    【讨论】:

    • 成功了。为了澄清,这是最终的“模式”:@"\/Date\((-?\d+)\)\/"
    【解决方案2】:

    当您从字符串构建正则表达式时,您不需要前导和尾随 / 字符。事实上,您不仅不需要需要它们,而且您也不想想要它们,因为正则表达式解析器假定您的意思是您希望它匹配前导和尾随@987654322 @ 围绕模式。

    【讨论】:

      猜你喜欢
      • 2021-02-14
      • 2012-03-06
      • 2011-10-16
      • 2010-09-21
      相关资源
      最近更新 更多