use*_*680 6 java regex reserved-words keyword
我正在寻找一种方法来将Java中保存的所有关键字检索到某种数据结构中.例如:"for,while,if,else,int,double等"
我需要对字符串进行名称验证,具体来说,我需要确保它不等于任何java关键字.
有没有一种特定的方法可以将所有关键字检索到一个数据结构中?或者我是否需要构建一个包含所有这些关键字的正则表达式字符串:"for | while | if | ..."并尝试匹配我的字符串?
谢谢
eve*_*ime 10
基本上,对关键字进行预排序并将其存储在一个数组中,并在关键字上使用Arrays.binarySearch以获得good'ol O(logn)复杂度
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"));
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
真正
或者,作为用户@typeracer,@ holger在评论中建议,您可以使用SourceVersion.isKeyword("void") 它在内部使用 javax.lang.model.SourceVersion库和Hashset数据结构,并为您更新列表.
我很惊讶没有人建议javax.lang.model.SourceVersion,因为它实际上从 Java 1.6 就已经存在了。
如果你需要检查某个字符串是否是保留关键字,你可以调用:
SourceVersion.isKeyword(str)
Run Code Online (Sandbox Code Playgroud)
如果您确实需要保留关键字的完整列表,您可以从该类的源代码中获取它:
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);
}
Run Code Online (Sandbox Code Playgroud)
注意:上述源代码来自Java 1.8,因此,如果您使用的是不同版本的 Java,请不要直接从本文复制粘贴。事实上,复制它可能根本不是一个好主意——他们将这个字段设为私有是有充分理由的——您可能不想在每个新的 Java 版本中都保持它是最新的。但如果您绝对必须拥有它,请从您自己的 JDK 发行版中的源代码中复制它,请记住,您以后可能需要手动不断更新它。
| 归档时间: |
|
| 查看次数: |
4995 次 |
| 最近记录: |