Si tengo una cadena como esta:
FOO[BAR]
Necesito una forma genérica de sacar la cadena "BAR" de la cadena para que, sin importar qué cadena esté entre corchetes, pueda obtener la cadena.
p.ej
FOO[DOG] = DOG
FOO[CAT] = CAT
Debería poder utilizar cuantificadores no codiciosos, específicamente * ?. Probablemente quieras lo siguiente:
Pattern MY_PATTERN = Pattern.compile("\\[(.*?)\\]");
Esto le dará un patrón que coincidirá con su cadena y colocará el texto entre corchetes en el primer grupo. Eche un vistazo a la documentación de Pattern API para obtener más información.
Para extraer la cadena, puede usar algo como lo siguiente:
Matcher m = MY_PATTERN.matcher("FOO[BAR]");
while (m.find()) {
String s = m.group(1);
// s now contains "BAR"
}
la forma no regex:
alternativamente, para un rendimiento ligeramente mejor / uso de memoria (gracias Hosam):
fuente
lastIndexOf(']')
lugar, usaría , que manejaría paréntesis anidados. Además, creo que usar elindexOf(char)
sería más rápido queindexOf(String)
.lastIndexOf
que sin duda será más rápido encontrar el corchete de cierre.Este es un ejemplo de trabajo:
RegexpExample.java
Muestra :
fuente
fuente
Si simplemente necesita obtener lo que sea que esté en medio
[]
, puede usarlo\[([^\]]*)\]
así:Si necesita que tenga la forma
identifier + [ + content + ]
, puede limitar la extracción del contenido solo cuando el identificador sea alfanumérico:Esto validará cosas como
Foo [Bar]
,myDevice_123["input"]
por ejemplo.Tema principal
El principal problema es cuando quieres extraer el contenido de algo como esto:
El Regex no funcionará y volverá
BAR[CAT[123
yFOO
.Si cambiamos la expresión regular a,
\[(.*)\]
entonces estamos bien, pero si estás tratando de extraer el contenido de cosas más complejas como:Ninguna de las expresiones regulares funcionará.
El Regex más preciso para extraer el contenido adecuado en todos los casos sería mucho más complejo, ya que necesitaría equilibrar
[]
pares y proporcionarle el contenido.Una solución más simple
Si sus problemas se vuelven complejos y el contenido de lo
[]
arbitrario, en su lugar, podría equilibrar los pares[]
y extraer la cadena usando rathe de código simple que un Regex:Esto es más pseudocódigo que código real, no soy un codificador de Java, así que no sé si la sintaxis es correcta, pero debería ser lo suficientemente fácil de mejorar.
Lo que cuenta es que este código debería funcionar y permitirle extraer el contenido del
[]
, por complejo que sea.fuente
Creo que tu expresión regular se vería así:
Asumiendo que FOO va a ser constante.
Entonces, para poner esto en Java:
fuente
Esto devolverá el valor entre el primer '[' y el último ']'
Foo [Bar] => Bar
Foo [Bar [prueba]] => Bar [prueba]
Nota: Debe agregar la comprobación de errores si la cadena de entrada no está bien formada.
fuente
suponiendo que no se permita ningún otro corchete de cierre dentro, / FOO \ [([^ \]] *) \] /
fuente
Definiría que quiero un número máximo de caracteres que no sean] entre
[
y]
. Estos deben escaparse con barras diagonales invertidas (y en Java, deben escaparse nuevamente), y la definición de no- es una clase de caracteres, por lo tanto, dentro[
y]
(es decir[^\\]]
). El resultado:fuente
Así funciona si desea analizar alguna cadena que proviene de mYearInDB.toString () = [2013] le dará 2013
fuente
Esta expresión regular funciona para mí:
ejemplo:
salida:
Probado en http://rubular.com/
fuente
Esto devolverá una cadena tomando solo la cadena entre corchetes.
Esto elimina todas las cuerdas del exterior de corchetes.
Puede probar este código de muestra de Java en línea: http://tpcg.io/wZoFu0
Puede probar esta expresión regular desde aquí: https://regex101.com/r/oUAzsS/1
fuente