respuesta corta:.. utilizar subsecuencia()
if (line.contains("[LoadFile]"))
result = line.subSequence(line.indexOf('"'), line.lastIndexOf('"')).toString();
En mi máquina, esto siempre requiere menos de 10,000 ns.
Estoy tomando "eficiente" para significar más rápido.
La opción regex es considerablemente más lenta (aproximadamente 9 o 10 veces más lenta). La principal ventaja de la opción de expresión regular es que podría ser más fácil para otro programador averiguar lo que está haciendo (pero luego usar comentarios para ayudarlos).
que la opción más eficiente de expresiones regulares, pre-compilarlo:
private static final String FILE_REGEX = ".*\\[LoadFile\\]\\s+file\\s+=\\s+\"([^\"].+)\".*";
private static final Pattern FILE_PATTERN = Pattern.compile(FILE_REGEX);
Pero esto todavía deja más lento. Grabo tiempos entre 80,000 y 100,000 ns.
La opción StringTokenizer es más eficiente que la expresión regular:
if (line.contains("[LoadFile]")) {
StringTokenizer tokenizer = new StringTokenizer(line, "\"");
tokenizer.nextToken();
result = tokenizer.nextToken();
}
Esta ronda los 40.000 ns para mí, poniéndolo en al 2-3 veces más rápido que la expresión regular.
En este escenario, split() también es una opción, que para mí (usando Java 6_13) es sólo un poco más rápido que el Tokenizer:
if (line.contains("[LoadFile]")) {
String[] values = line.split("\"");
result = values[1];
}
Esto da un promedio de 35.000 veces ns para mí.
Por supuesto, nada de esto es la comprobación de errores. Cada opción se volverá un poco más lenta cuando empieces a factorizar eso, pero creo que la opción subSequnce() aún los superará a todos. Debe conocer los parámetros exactos y las expectativas para determinar cuán tolerante a fallas debe ser cada opción.
". * \\ [LoadFile \\] \\ s * file \\ s * = \\ s * \" ([^ \\\ "]. *) \". * "Sería mejor hacer coincidir cualquier número de espacios en blanco – Jean
". * \" ([^ \\\ "]] *) \". * "sería aún mejor ya que no nos importa el formato de prefijo en absoluto (conocido por defecto) y no contiene cualquier cita. – gizmo
FYI, la expresión regular de Jean tampoco coincidiría con el espacio en blanco, ej. [LoadFile] file = "foo/bar/baz.xml". Por lo tanto, si desea al menos un carácter de espacio en blanco, use + en lugar de * como jinguy originalmente especificado. –