Tengo este código y quiero saber si puedo reemplazar solo grupos (no todos los patrones) en Java regex. Código:
//...
Pattern p = Pattern.compile("(\\d).*(\\d)");
String input = "6 example input 4";
Matcher m = p.matcher(input);
if (m.find()) {
//Now I want replace group one ( (\\d) ) with number
//and group two (too (\\d) ) with 1, but I don't know how.
}
java
regex
replace
regex-group
wokena
fuente
fuente
Respuestas:
Utilice
$n
(donde n es un dígito) para referirse a las subsecuencias capturadas enreplaceFirst(...)
. Supongo que desea reemplazar el primer grupo con la cadena literal "número" y el segundo grupo con el valor del primer grupo.Considere
(\D+)
para el segundo grupo en lugar de(.*)
.*
es un comparador codicioso y al principio consumirá el último dígito. El comparador tendrá que dar marcha atrás cuando se dé cuenta de que la final(\d)
no tiene nada que igualar, antes de que pueda coincidir con el dígito final.fuente
m.replaceFirst("number $2$1");
should bem.replaceFirst("number $3$1");
Puede usar
Matcher#start(group)
yMatcher#end(group)
para construir un método de reemplazo genérico:Consulte la demostración en línea aquí .
fuente
Lamento vencer a un caballo muerto, pero es un poco extraño que nadie haya señalado esto: "Sí, puedes, pero esto es lo opuesto a cómo usas la captura de grupos en la vida real".
Si usa Regex de la forma en que debe usarse, la solución es tan simple como esta:
O como lo señala legítimamente shmosel a continuación,
... ya que en su expresión regular no hay ninguna buena razón para agrupar los decimales.
Por lo general, no usa grupos de captura en las partes de la cadena que desea descartar , los usa en la parte de la cadena que desea conservar .
Si realmente desea grupos que desea reemplazar, lo que probablemente desee en su lugar sea un motor de plantillas (por ejemplo, bigote, ejs, StringTemplate, ...).
Como un aparte para los curiosos, incluso los grupos que no capturan en las expresiones regulares están ahí para el caso de que el motor de expresiones regulares los necesite para reconocer y omitir el texto variable. Por ejemplo, en
que los necesite si su entrada puede buscar ya sea como "abcabc captura de mí bcdbcd" o "abc captura de mí BCD" o simplemente "la captura de mí".
O para decirlo al revés: si el texto es siempre el mismo y no lo captura, no hay ninguna razón para usar grupos.
fuente
\d(.*)\d
Será suficiente.$11
aquí. ¿Por qué 11?Agregue un tercer grupo agregando parens alrededor
.*
, luego reemplace la subsecuencia con"number" + m.group(2) + "1"
. p.ej:fuente
"number$21"
funciona y"number" + m.group(2) + "1"
no.number$21
que reemplazaría al grupo 21, no al grupo 2 + la cadena "1".Puede usar los métodos matcher.start () y matcher.end () para obtener las posiciones del grupo. Entonces, usando estas posiciones, puede reemplazar fácilmente cualquier texto.
fuente
reemplace los campos de contraseña de la entrada:
fuente
Aquí hay una solución diferente, que también permite el reemplazo de un solo grupo en múltiples partidos. Utiliza pilas para invertir el orden de ejecución, por lo que la operación de cadena se puede ejecutar de forma segura.
fuente