risposta breve:.. utilizzare sottosequenza()
if (line.contains("[LoadFile]"))
result = line.subSequence(line.indexOf('"'), line.lastIndexOf('"')).toString();
Sulla mia macchina, questo richiede sempre meno di 10.000 ns.
Sto prendendo "efficiente" per significare più veloce.
L'opzione gee è notevolmente più lenta (circa 9 o 10 volte più lenta). Il vantaggio principale dell'opzione regex è che potrebbe essere più semplice per un altro programmatore capire cosa stai facendo (ma poi usare i commenti per aiutarli).
Per rendere l'opzione regex più efficiente, pre-compilarlo:
private static final String FILE_REGEX = ".*\\[LoadFile\\]\\s+file\\s+=\\s+\"([^\"].+)\".*";
private static final Pattern FILE_PATTERN = Pattern.compile(FILE_REGEX);
Ma questo lascia ancora più lento. Registro i tempi tra 80.000 e 100.000 ns.
L'opzione StringTokenizer è più efficiente rispetto alla regex:
if (line.contains("[LoadFile]")) {
StringTokenizer tokenizer = new StringTokenizer(line, "\"");
tokenizer.nextToken();
result = tokenizer.nextToken();
}
Questo si aggira intorno 40.000 ns per me, mettendolo in a 2-3 volte più veloce rispetto l'espressione regolare.
In questo scenario, split() è anche un'opzione, che per me (utilizzando Java 6_13) è solo un po 'più veloce rispetto al Tokenizer:
if (line.contains("[LoadFile]")) {
String[] values = line.split("\"");
result = values[1];
}
Questo medie tempi di 35.000 ns per me.
Ovviamente, nessuno di questi controlla errori. Ogni opzione diventerà un po 'più lenta quando inizi a scomporla, ma penso che l'opzione subSequnce() continuerà a batterli tutti. Devi conoscere i parametri esatti e le aspettative per capire come deve essere tollerante ogni opzione.
". * \\ [LoadFile \\] \\ s * file \\ s * = \\ s * \" ([^ \\\ "]. *) \". * "Sarebbe meglio abbinare qualsiasi numero di spazi bianchi – Jean
". * \" ([^ \\\ "]. *) \". * "sarebbe ancora meglio dato che non ci interessa affatto il formato del prefisso (noto per impostazione predefinita) e non contiene qualsiasi citazione. – gizmo
FYI, la regex di Jean non corrisponderebbe allo spazio bianco, es. [LoadFile] file = "foo/bar/baz.xml". Quindi se vuoi almeno un carattere di spazio bianco, usa + invece di * come jinguy originariamente specificato. –