Почему неэкранирование строки портит мое регулярное выражение?
Я пытаюсь сгенерировать код 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+)\)/"
Как ни странно, это регулярное выражение соответствует строке, которая начинается и заканчивается /
, Это было твоим намерением, не так ли?
Вам не нужны ведущие и конечные /
символы, когда вы строите регулярное выражение из строки. На самом деле, вы не только не нуждаетесь в них, но и не хотите их, потому что синтаксический анализатор регулярных выражений предполагает, что вы хотите, чтобы он совпадал с ведущими и конечными /
вокруг картины.