简短回答:使用 subSequence() 方法。
if (line.contains("[LoadFile]"))
result = line.subSequence(line.indexOf('"'), line.lastIndexOf('"')).toString();
在我的机器上,这通常只需要少于10,000纳秒。
我理解“高效”表示更快。
“regex”选项要慢得多(大约慢9到10倍)。使用“regex”选项的主要优点是它可能更容易为其他程序员弄清楚您正在做什么(但是,请使用注释来帮助他们)。
为了使“regex”选项更加高效,先预编译它:
private static final String FILE_REGEX = ".*\\[LoadFile\\]\\s+file\\s+=\\s+\"([^\"].+)\".*"
private static final Pattern FILE_PATTERN = Pattern.compile(FILE_REGEX)
但这仍然使它变慢了。我记录的时间在80,000到100,000纳秒之间。
StringTokenizer选项比正则表达式更有效:
if (line.contains("[LoadFile]")) {
StringTokenizer tokenizer = new StringTokenizer(line, "\"");
tokenizer.nextToken();
result = tokenizer.nextToken();
}
这对我来说大约是40,000 ns,比正则表达式快2-3倍。
在这种情况下,split()也是一种选择,对我来说(使用Java 6_13),它比Tokenizer稍快一点:
if (line.contains("[LoadFile]")) {
String[] values = line.split("\"");
result = values[1];
}
这对我来说的平均时间是35,000纳秒。
当然,这些都没有检查错误。当你开始考虑这一点时,每个选项都会变得稍微慢一些,但我认为subSequnce()选项仍然能够击败它们所有。您必须知道确切的参数和期望,以确定每个选项需要多容错。
.matcher(inputString)
(不要大写),您必须调用Matcher上的.matches()
或.find()
来应用正则表达式。 - Alan Moore