Почему неэкранирование строки портит мое регулярное выражение? - PullRequest
2 голосов
/ 20 января 2012

Я пытаюсь сгенерировать код 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 ]

2 голосов
/ 20 января 2012

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

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

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

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

2 голосов
/ 20 января 2012

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

...