在Kotlin/Java中,是否有标准函数来确定String是否是有效的变量/函数名



在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的答案。

相关内容

  • 没有找到相关文章

最新更新