我正在寻找一种方法来将Java中保存的所有关键字检索到某种数据结构中。例如:" for,while,if,else,int,double等等"
我需要对字符串进行名称验证,具体来说,我需要确保它不等于任何java关键字。
是否有将特定关键字检索到一个数据结构的特定方法?或者我是否需要构建一个包含所有这些关键字的正则表达式字符串:" for | while | if | ..."并尝试匹配我的字符串?
由于
答案 0 :(得分:10)
基本上,预先排序关键字并将其存储在一个数组中,并使用 Arrays.binarySearch 对您的关键字进行良好的 O(登录)复杂性
import java.util.Arrays;
public class MainDemo {
static final String keywords[] = { "abstract", "assert", "boolean",
"break", "byte", "case", "catch", "char", "class", "const",
"continue", "default", "do", "double", "else", "extends", "false",
"final", "finally", "float", "for", "goto", "if", "implements",
"import", "instanceof", "int", "interface", "long", "native",
"new", "null", "package", "private", "protected", "public",
"return", "short", "static", "strictfp", "super", "switch",
"synchronized", "this", "throw", "throws", "transient", "true",
"try", "void", "volatile", "while" };
public static boolean isJavaKeyword(String keyword) {
return (Arrays.binarySearch(keywords, keyword) >= 0);
}
//Main method
public static void main(String[] args) {
System.out.println(isJavaKeyword("void"));
}
}
<强>输出:强>
真
或者,作为用户@typeracer,@ holger在评论中建议,
您可以在内部使用SourceVersion.isKeyword("void")
库和javax.lang.model.SourceVersion
数据结构的Hashset
,并为您更新列表。
答案 1 :(得分:3)
没有直接的API方法。作为替代方案,您可以将它们放在一个数组中,并检查输入的关键字匹配数组中的关键字。
public static String[] keys= { "new",..... }
然后
for (int i = 0; i < keys.length; i++) {
if (input.equals(keys[i])) {
// TO DO
}
}
答案 2 :(得分:1)
好的因为没有自动的方法,我将创建一个由所有关键字组成的文本文件: List of Java Keywords
然后在运行时检查文件,将每个关键字插入数组或arraylist(或正则表达式字符串),并在检查名称有效性时检查使用该数据结构。
感谢所有人
答案 3 :(得分:1)
令我惊讶的是,目前还没有人建议使用javax.lang.model.SourceVersion,因为它自Java 1.6以来就已经存在。
如果您需要检查某个字符串是否为保留关键字,则可以调用:
SourceVersion.isKeyword(str)
如果确实需要保留关键字的完整列表,则可以从该类的源代码中获取它:
private final static Set<String> keywords;
static {
Set<String> s = new HashSet<String>();
String [] kws = {
"abstract", "continue", "for", "new", "switch",
"assert", "default", "if", "package", "synchronized",
"boolean", "do", "goto", "private", "this",
"break", "double", "implements", "protected", "throw",
"byte", "else", "import", "public", "throws",
"case", "enum", "instanceof", "return", "transient",
"catch", "extends", "int", "short", "try",
"char", "final", "interface", "static", "void",
"class", "finally", "long", "strictfp", "volatile",
"const", "float", "native", "super", "while",
// literals
"null", "true", "false"
};
for(String kw : kws)
s.add(kw);
keywords = Collections.unmodifiableSet(s);
}
警告:上面的源代码来自 Java 1.8 ,因此,不要只是从这篇文章中复制并粘贴使用其他版本的Java。实际上,完全复制它可能不是一个好主意-他们出于充分的理由将字段设置为私有-您可能不想让每个新字段都保持最新Java版本。但是,如果您绝对必须拥有它,那么请从您自己的JDK发行版的源代码中复制它,请记住,以后可能必须手动保持更新。