验证 JavaScript 函数名称

新手上路,请多包涵

我可以用来匹配有效的 JavaScript 函数名称的正则表达式是什么……

例如 myfunction 有效,但 my<\fun\>ction 无效。

 [a-zA-Z0-9_])?

原文由 Zoom Pat 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 290
2 个回答

[编辑] 请参阅 下面@bobince 的帖子 以获得更正确和更彻底的答案。此答案已保留以供参考,并已编辑以减少错误。

JavaScript 中的有效名称必须以 Unicode 字母 ( \p{L} )、美元符号或下划线开头,然后可以包含任何这些字符以及数字,组合变音(重音)字符,以及各种连接标点符号和零宽度空间。 Additionally, it cannot be a word reserved by the JavaScript language (eg abstract , as , boolean , break , byte , case 等)。

完整的正则表达式解决方案在纯 JavaScript 中会相当复杂,但 XRegExp Unicode 插件 可以大大简化任务。 这个在线函数名称测试器 可能也很有用。

[原创] 这是一个 不完整的 正则表达式, _仅使用美国 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];
  };
}();

原文由 maerics 发布,翻译遵循 CC BY-SA 3.0 许可协议

这比您想象的要复杂。根据 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

将来可能还有其他一些。

IdentifierName 以以下内容开头:

 a letter
the $ sign
the _ underscore

并且可以进一步包含任何这些字符加上:

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

这些字符是根据 Unicode 字符类定义的,因此 [A-Z] 是不完整的。 Ä 是一个字母; ξ 是一个字母; 是一封信。您可以在标识符中使用所有这些,包括用于函数名称的那些。

不幸的是,JavaScript RegExp 不支持 Unicode。如果你说 \w 你只会得到 ASCII 字母数字。没有可行的方法来检查非 ASCII 标识符字符的有效性,除非在您的脚本中携带 Unicode 字符数据库的相关部分,这将非常庞大和笨拙。

您可以尝试简单地允许所有非 ASCII 字符,例如:

 ^[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*$

原文由 bobince 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题