pattern online matches examples example java regex string quantifiers

online - Expresiones de expresiones regulares en Java // s vs. // s+



regex examples (4)

Por favor, cual es la diferencia entre esas expresiones.

x = x.replaceAll("//s", ""); x = x.replaceAll("//s+", "");


El primer regex coincidirá con un carácter de espacio en blanco. El segundo regex hará coincidir a regañadientes uno o más caracteres de espacio en blanco. Para la mayoría de los propósitos, estas dos expresiones regulares son muy similares, excepto en el segundo caso, la expresión regular puede coincidir con una mayor parte de la cadena, si evita que la coincidencia de expresiones regulares falle. de http://www.coderanch.com/t/570917/java/java/regex-difference


El primero coincide con un solo espacio en blanco, mientras que el segundo coincide con uno o varios espacios en blanco. Son los llamados cuantificadores de expresiones regulares, y realizan coincidencias como esta (tomadas de la documentation ):

Greedy quantifiers X? X, once or not at all X* X, zero or more times X+ X, one or more times X{n} X, exactly n times X{n,} X, at least n times X{n,m} X, at least n but not more than m times Reluctant quantifiers X?? X, once or not at all X*? X, zero or more times X+? X, one or more times X{n}? X, exactly n times X{n,}? X, at least n times X{n,m}? X, at least n but not more than m times Possessive quantifiers X?+ X, once or not at all X*+ X, zero or more times X++ X, one or more times X{n}+ X, exactly n times X{n,}+ X, at least n times X{n,m}+ X, at least n but not more than m times


En primer lugar, debe comprender que la salida final de ambas declaraciones será la misma, es decir, para eliminar todos los espacios de la cadena dada.

Sin embargo, x.replaceAll("//s+", ""); será una forma más eficiente de recortar espacios (si la cadena puede tener múltiples espacios contiguos) debido a que potencialmente no hay reemplazos debido al hecho de que regex //s+ coincide con 1 o más espacios a la vez y los reemplaza con cadenas vacías.

Entonces, aunque obtienes el mismo resultado de ambos, es mejor usar:

x.replaceAll("//s+", "");


Esas dos llamadas replaceAll siempre producirán el mismo resultado, independientemente de lo que sea x . Sin embargo, es importante tener en cuenta que las dos expresiones regulares no son las mismas:

  • //s - coincide con un solo carácter de espacio en blanco
  • //s+ - coincide con la secuencia de uno o más caracteres de espacio en blanco.

En este caso, no hace ninguna diferencia, ya que está reemplazando todo con una cadena vacía (aunque sería mejor usar //s+ desde un punto de vista de eficiencia). Si estuvieras reemplazando con una cadena no vacía, los dos se comportarían de manera diferente.