Почему неэкранирование строки портит мое регулярное выражение?

Я пытаюсь сгенерировать код JavaScript, похожий на этот

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

    return jsonDate;
}

В Script # я написал это:

    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 ответа

Решение

В /\/Date\((-?\d+)\)\//ведущий и тянущийся / не являются частью регулярного выражения, они являются разделителями литерала регулярного выражения. Они сообщают интерпретатору JavaScript, где начинается и заканчивается регулярное выражение, подобно кавычкам, разделяющим строковые литералы.

В коде Script# вы создаете регулярное выражение в форме строкового литерала, а не литерала регулярного выражения. Компилятор считает, что ведущий и конечный / предназначены для соответствия буквальным косым чертам. После того, как они ушли, не должно быть необходимости избегать буквальных косых черт в регулярном выражении. Это оставляет вас с:

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

Как ни странно, это регулярное выражение соответствует строке, которая начинается и заканчивается /, Это было твоим намерением, не так ли?

Вам не нужны ведущие и конечные / символы, когда вы строите регулярное выражение из строки. На самом деле, вы не только не нуждаетесь в них, но и не хотите их, потому что синтаксический анализатор регулярных выражений предполагает, что вы хотите, чтобы он совпадал с ведущими и конечными / вокруг картины.

Другие вопросы по тегам