Проверьте имя функции JavaScript

Что было бы регулярным выражением, которое я могу использовать для соответствия допустимому имени функции JavaScript...

Например. myfunction было бы допустимо, но my<\fun\>ction было бы недопустимо.

[a-zA-Z0-9_])?
21
задан Alan Moore 6 January 2010 в 08:38
поделиться

4 ответа

[EDIT] См. Сообщение @bobince ниже для более правильного и подробного ответа. Этот ответ был сохранен для справки и отредактирован, чтобы он был менее ошибочным.

Допустимое имя в JavaScript должно начинаться с буквы Юникода ( \ p {L} ), знака доллара или подчеркивания, затем может содержать любой из этих символов, а также цифры с диакритическим знаком (ударение). символы, а также различные знаки препинания и пробелы нулевой ширины. Кроме того, это слово не может быть зарезервировано языком JavaScript (например, abstract , as , boolean , break , byte). , дело и т. Д.).

Полное решение с использованием регулярных выражений на простом JavaScript было бы довольно сложным, но подключаемый модуль XRegExp Unicode может значительно упростить задачу. Этот онлайн-тестер имени функции также может быть полезен.

[ORIGINAL] Вот неполное регулярное выражение, использующее только буквы US ASCII :

var fnNameRegex = /^[$A-Z_][0-9A-Z_$]*$/i;

Вы также должны убедиться, что это не так соответствовать любым зарезервированным словам (например, abstract, boolean, break, byte, ..., while, with и т. д.). Вот начало этого списка и пример функции:

var isValidFunctionName = function() {
  var validName = /^[$A-Z_][0-9A-Z_$]*$/i;
  var reserved = {
    'abstract':true,
    'boolean':true,
    // ...
    'with':true
  };
  return function(s) {
    // Ensure a valid name and not reserved.
    return validName.test(s) && !reserved[s];
  };
}();
12
ответ дан 29 November 2019 в 06:11
поделиться

Это сложнее, чем вы думаете. Согласно стандарту ECMAScript, идентификатором является:

an IdentifierName that is not a ReservedWord

, поэтому сначала нужно проверить, не является ли идентификатор одним из:

instanceof typeof break do new var case else return void catch finally
continue for switch while this with debugger function throw default if
try delete in

, а возможно, и некоторыми другими в будущем.

Имя идентификатора начинается с:

a letter
the $ sign
the _ underscore

и в дальнейшем может содержать любой из этих символов плюс:

a number
a combining diacritical (accent) character
various joiner punctuation and zero-width spaces

Эти символы определены в терминах классов символов Юникода, поэтому [A-Z] является неполным. Ä - буква; ξ - буква; - буква. Вы можете использовать все идентификаторы, включая те, которые используются для имен функций.

К сожалению, JavaScript RegExp не является Юникодом. Если вы скажете \w, то получите только ASCII буквенно-цифровые. Невозможно проверить действительность не-ASCII-символов идентификатора, кроме как носить с собой соответствующие части Базы данных символов Юникода с вашим скриптом, что было бы очень большим и неуклюжим.

Можно попробовать просто разрешить все символы, не относящиеся к ASCII, например:

^[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*$
43
ответ дан 29 November 2019 в 06:11
поделиться

Это должно быть очень просто. Действительные имена функций могут состоять только из буквенно-цифровых, скобок и, возможно, значений параметров внутри парен (я не знаю достаточно javascript, чтобы знать, определены ли параметры при вызове функции) и должны начинаться с буквы, верно? Следовательно, чтобы подтвердить, что строка является правильным именем функции. Следовательно, это должно работать:

[a-xA-z]+[a-zA-z0-9_]\*(\\(.*?\\))\*
0
ответ дан 29 November 2019 в 06:11
поделиться

То, чего вы не хотите, близко или, возможно, невозможно - я не анализировал грамматику, чтобы точно знать, что именно.

Во-первых, взгляните на грамматику ECMAScript для идентификаторов. Вы можете увидеть его на сайте ANTLR . Прокрутите вниз до того места, где определены идентификаторы:

identifierName:
    // snip full comment
    identifierStart (identifierPart)*
    ;

identifierStart:
    unicodeLetter
    | DOLLAR
    | UNDERSCORE
    | unicodeEscapeSequence
    ;

Грамматика использует EBNF, поэтому вам нужно будет следовать этим двум нетерминалам: identifierStart и identifierPart . Основная проблема, с которой вы столкнетесь, заключается в том, что вам нужно учитывать большую часть Unicode и его escape-символы.

Например, с identifierStart мы видим, что регулярное выражение должно разрешить букву, знак доллара, подчеркивание или escape-последовательность Unicode в качестве первого «символа».

Таким образом, вы можете начать свое регулярное выражение:

"[$_a-zA-Z]..."

Конечно, вам нужно изменить a-zA-Z для поддержки всего Юникода, а затем расширить выражение для поддержки Unicode Escape Последовательность, но, надеюсь, это даст вам начало процесса.

Конечно, если вам нужно только грубое приближение, многие другие ответы предоставляют грубое регулярное выражение, которое обрабатывает небольшое подмножество того, что на самом деле разрешено.

3
ответ дан 29 November 2019 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: