为什么取消字符串搞乱我的正则表达式?

时间:2012-01-19 22:05:56

标签: javascript regex escaping script#

我正在尝试生成类似于此

的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对象完全不同。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

从字符串构建正则表达式时,不需要前导和尾随/字符。事实上,你不仅需要它们,你不想要它们,因为正则表达式解析器假定你希望它匹配一个前导和尾随{{ 1}}围绕着模式。

答案 1 :(得分:2)

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

在脚本#代码中,您以字符串文字的形式创建正则表达式,而不是正则表达式文字。编译器认为前导和尾随/旨在匹配文字斜杠。随着那些消失,不应该在正则表达式中逃避字面斜线。这让你:

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

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