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
JavaScript中的有效名称必须以Unicode字母开头(\p{L})、美元符号或下划线,则可以包含这些字符中的任何一个以及数字,并将可区别的(重音)字符以及各种连接符标点和零宽度空格。此外,它不能是JavaScript语言的保留字(例如,abstract、as、boolean、break、byte、case等)。 在纯JavaScript中,完整的正则表达式解决方案会相当复杂,但XRegExp Unicode插件可以大大简化任务。This online function name tester可能也很有用。
7条答案
按热度按时间z8dt9xmd1#
这比你想象的要复杂得多。根据ECMAScript标准,标识符是:
因此首先必须检查标识符是否为以下项之一:
并且将来可能会有一些其他的。
IdentifierName以下列字符开头:
并且可以进一步包括那些字符中的任何一个加上:
这些字符是根据Unicode字符类定义的,因此
[A-Z]
是不完整的。Ä
是字母;ξ
是字母;京
是一个字母。您可以在标识符中使用所有这些字母,包括用于函数名称的字母。不幸的是,JavaScript RegExp不能识别Unicode。如果你说
\w
,你只能得到ASCII字母数字。没有可行的方法来检查非ASCII标识符字符的有效性,除非你的脚本携带Unicode字符数据库的相关部分,这将是非常庞大和笨拙的。您可以尝试只允许所有非ASCII字符,例如:
9o685dep2#
currently accepted answer不正确。bobince’s answer更像。
引用Valid JavaScript variable names,我的文章总结了相关的规范部分:
标识符必须以
$
、_
或Unicode类别“Uppercase letter (Lu)”、“Lowercase letter (Ll)”、“Titlecase letter (Lt)”、“Modifier letter (Lm)”、“Other letter (Lo)”或“Letter number (Nl)”中的任何字符开头。字串的其馀部分可以包含相同的字符,加上任何 *U+200 C零长度非链接字符 *、*U+200 D零长度链接字符 *,以及Unicode分类“Non-spacing mark (Mn)”、“Spacing combining mark (Mc)”、“Decimal digit number (Nd)”或“Connector punctuation (Pc)”中的字符。
链接的文章涵盖了更多的陷阱,但这是它的主旨。
我还创建了a tool,它将告诉您输入的任何字符串是否是符合ECMAScript 5.1和Unicode 6.1的有效JavaScript变量名:
附言:为了给予你知道目前公认的答案是多么的错误:如果您要将所有这些规则总结为一个JavaScript的仅ASCII正则表达式,它将是11,236个字符长(对于ECMAScript5.1/Unicode6.1.0)。
w46czmvw3#
**[编辑]**请看下面@bobince的帖子,以获得更正确和全面的答案。此答案仅供参考,并进行了编辑,以减少错误。
JavaScript中的有效名称必须以Unicode字母开头(
\p{L}
)、美元符号或下划线,则可以包含这些字符中的任何一个以及数字,并将可区别的(重音)字符以及各种连接符标点和零宽度空格。此外,它不能是JavaScript语言的保留字(例如,abstract
、as
、boolean
、break
、byte
、case
等)。在纯JavaScript中,完整的正则表达式解决方案会相当复杂,但XRegExp Unicode插件可以大大简化任务。This online function name tester可能也很有用。
**[ORIGINAL]*以下是一个 * 不完整 * 的正则表达式, 仅使用US ASCII字母 *:
你还必须检查它不匹配任何保留字(例如abstract、boolean、break、byte、...、while、with等)。
y0u0uwnf4#
你不想要的东西几乎是,或者是不可能的--我还没有分析语法来确定是哪一种。
首先,看一下标识符的ECMAScript语法。你可以在ANTLR site上看到一个。向下滚动到它定义标识符的地方:
语法使用EBNF,因此需要遵循这两个非终结符:
identifierStart
和identifierPart
。您将遇到的主要问题是,您需要考虑unicode及其转义字符的大部分内容。例如,对于
identifierStart
,我们看到正则表达式需要允许字母、美元符号、下划线或Unicode转义序列作为第一个“字符”。因此,您可以启动正则表达式:
当然,您需要修改
a-zA-Z
以支持所有Unicode,然后扩充表达式以支持Unicode转义序列,但希望这能为您提供一个开始。当然,如果您只需要一个粗略的近似值,许多其他响应都提供了一个粗略的正则表达式,用于处理实际允许的一小部分内容。
1dkrff035#
如果正则表达式不是必须的..
u91tlkcl6#
根据Anas Nakawa前面回答的精神,如果允许所讨论的脚本使用
new Function()
,这可能涵盖了大多数基础:使用
new Function()
确保实际上没有代码被计算,这是不太安全的(我不确定我是否敢称之为安全的,虽然,也许有人可以以某种方式找到如何摆脱这种情况)。正则表达式确保字符串的长度不为零,并避免使用所有可能导致问题的控制字符(或空格,有人可能会传递
foo; console.log("hello there")
,如果没有正则表达式,foo; console.log("hello there")
也会传递)。(这要归功于我的朋友Fabian Iwand的正则表达式,我们对这个替代的更短的方法感到困惑)
rjee0c157#
这应该很简单。有效的函数名只能由字母数字、括号和括号内的参数值组成(我不知道足够多的javascript来知道参数是否在函数调用中定义),并且必须以字母开头,对吗?因此,要验证字符串是否是有效的函数名,这应该是可行的: