SLaks - это правильно, но вам не нужно вызывать проблему остановки, чтобы доказать, что это невозможно с регулярными выражениями .С помощью регулярного выражения вы даже не сможете определить, содержит ли функция JavaScript return
, используемое в качестве ключевого слова, даже если вы можете сопоставить фигурные скобки, чтобы указать, где заканчивается функция определения.
Рассмотрим
function () {
1 /[/**/]; return 1 ///
}
против
function () {
/[/**/]; return 1 ///
}
Первый содержит возврат, потому что он эквивалентен
function () {
1 / [];
return 1;
///
}
, а второй нет, потому что он эквивалентен
function () {
new RegExp("[\\/\\*\\*\\/]; return 1 ");
//
}
Между /*
и */
может быть произвольно много символов, поэтому вам необходимо полностью устранить неоднозначность первого /
, чтобы определить, является ли это оператором деления или регулярным выражением, чтобы определить, встречается ли ключевое слово return
вфункция.Это требует полного разбора, а JavaScript не имеет регулярной лексической грамматики.