在Kotlin/Java中,是否有一个标准函数可以确定String是否是有效的变量/函数名,而不必将其封装在反引号中?如
functionIAmLookingFor("do-something") shouldBe false
functionIAmLookingFor("doSomething") shouldBe true
编辑:我不想把所有的东西都放在后面。
我们需要这样做的原因是:我们有一个工具,可以将实例序列化为可编译的Kotlin。我们遇到了以下边缘情况:
enum class AssetType { TRANSFERRABLE, `NON-TRANSFERRABLE` }
因此,当我们用字段NON-TRANSFERRABLE
来反映一个实例时,我们需要用反勾号来包装它:
val actual = MyAsset( type = `NON-TRANSFERRABLE`
这就是我问这个问题的原因。目前,我们只是在README
中表示,目前我们不支持任何需要反勾号的名称。
您可以手动完成:
- https://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#isJavaIdentifierPart(字符(
- https://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#isJavaIdentifierStart(字符(
类似这样的东西:
boolean isJavaIdentifier(String s) {
if (s == null || s.isEmpty()) return false;
if (!Character.isJavaIdentifierStart(s.charAt(0)) {
return false;
}
for (int i = 1, n = s.length(); i < n; ++i) {
if (!Character.isJavaIdentifierPart(s.charAt(i)) {
return false;
}
}
return true;
}
我不知道Kotlin的情况,但我认为使用770抓斗制造商回答作为参考。
我快速查看了kotlin编译器lexer。它有一些预定义的变量,以下是摘录:
LETTER = [:letter:]|_
IDENTIFIER_PART=[:digit:]|{LETTER}
PLAIN_IDENTIFIER={LETTER} {IDENTIFIER_PART}*
ESCAPED_IDENTIFIER = `[^`n]+`
IDENTIFIER = {PLAIN_IDENTIFIER}|{ESCAPED_IDENTIFIER}
FIELD_IDENTIFIER = ${IDENTIFIER}
来源:https://github.com/JetBrains/kotlin/blob/master/compiler/psi/src/org/jetbrains/kotlin/lexer/Kotlin.flex
这些似乎是某种正则表达式,您可以根据需要将它们组合起来,然后进行匹配。据我所知,这就是编译器验证标识符名称的方式。
Edit:当然,这是lexer的代码,这意味着如果它找到任何其他令牌,它就是无效的。所有令牌以及如何识别它们都在该文件和KtTokens文件中定义。您可以使用此信息作为查找非法令牌的参考。对于java,使用NoDataFound的答案。