获取所有Java保留关键字的列表

时间:2014-06-17 13:27:23

标签: java regex keyword reserved-words

我正在寻找一种方法来将Java中保存的所有关键字检索到某种数据结构中。例如:" for,while,if,else,int,double等等"

我需要对字符串进行名称验证,具体来说,我需要确保它不等于任何java关键字。

是否有将特定关键字检索到一个数据结构的特定方法?或者我是否需要构建一个包含所有这些关键字的正则表达式字符串:" for | while | if | ..."并尝试匹配我的字符串?

由于

4 个答案:

答案 0 :(得分:10)

来自axis.apache.org

基本上,预先排序关键字并将其存储在一个数组中,并使用 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发行版的源代码中复制它,请记住,以后可能必须手动保持更新。