(?!function\s+)([_$a-zA-Z][_$a-zA-Z0-9]*)(?=\s*\()
Есть много проблем, с которыми вы можете столкнуться при попытке проанализировать JavaScript с помощью регулярного выражения.Во-первых, у нас есть пара вещей, которые в нормальных условиях будут игнорироваться лексером.
WhiteSpace
LineTerminator
Comment
Теперь концепция пробела не так проста, как символ пробела.Вот полный список символов, которые должны быть указаны в вашем регулярном выражении.
WhiteSpace:
'\u0009'
'\u000c'
'\u00a0'
'\u180e'
'\u2001'
'\u2003'
'\u2005'
'\u2007'
'\u2009'
'\u202f'
'\u3000'
'\u000b'
'\u0020'
'\u1680'
'\u2000'
'\u2002'
'\u2004'
'\u2006'
'\u2008'
'\u200a'
'\u205f'
'\ufeff'
Сразу же сложность нашего регулярного выражения возросла.Теперь у нас есть производство LineTerminator, которое опять-таки не так просто, как вы думаете.
LineTerminator:
'\u000a'
'\u000d'
'\u2028'
'\u2029'
Я не буду вдаваться в подробности, но приведу несколько примеров совершенно правильных определений функций.
function
a() {
}
function /*Why is this comment here!!!*/ a() {
}
Итак, у нас остались хорошие и плохие новости.Хорошей новостью является то, что мое простое регулярное выражение будет охватывать большинство распространенных случаев.Пока файл написан в здравом уме, он должен работать просто отлично.Плохая новость заключается в том, что если вы хотите охватить все угловые случаи, у вас останется чудовище регулярного выражения.
Примечание
Я просто хотел сказать, что регулярное выражениесоответствие действительного идентификатора функции было бы особенно ужасным.