pattern - java util regex
¿Está regex en Java anclado por defecto con un carácter ^ y $? (3)
Desde mi entendimiento de las expresiones regulares, la cadena "00 ###" tiene que coincidir con "[0-9]", pero no con "^ [0-9] $". Pero no funciona con las expresiones regulares de Java.
Después de investigar este problema, encontré la siguiente información ( http://www.wellho.net/solutions/java-regular-expressions-in-java.html ):
Puede parecer que las expresiones regulares de Java están ancladas por defecto con un carácter ^ y $.
¿Podemos estar seguros de que esto es cierto para todas las versiones de JDK? ¿Y se puede desactivar este modo (es decir, deshabilitar el anclaje predeterminado con ^ y $)?
Además de la respuesta del Sr. Byers , tenga en cuenta también que el Matcher#find()
retoma su último partido exitoso. Eso solo importa para el uso repetido de una instancia de Matcher
, pero esa es la característica que permite la emulación de la afirmación /G
de Perl. También es útil en el concierto con Matcher#usePattern(Pattern)
, donde se usa un patrón para encontrar un prefijo y luego se intercambia un patrón repetitivo (incluido /G
) para recorrer en repetidas coincidencias con Matcher#find()
.
También está el Matcher#lookingAt()
, que está limitado implícitamente al principio ( ^
) pero no al final. Prefiero pensar que el nombre fue inspirado por la función de Emacs looking-at
.
Sí, matches()
siempre actúa como si la expresión regular estuviera anclada en ambos extremos. Para obtener el comportamiento tradicional, que es coincidir con cualquier subcadena del objetivo, debe utilizar find()
(como ya han señalado otros). Muy pocas herramientas de expresiones regulares ofrecen algo equivalente a los métodos matches()
Java, por lo que su confusión está justificada. El único otro en el que puedo pensar es el sabor del esquema XML .
Como lo explica el artículo al que está vinculado, depende de la función a la que llame. Si desea agregar ^ y $ de forma predeterminada, use String#matches
o Matcher#matches
. Si no quieres eso, usa el método Matcher#find
lugar.
import java.util.regex.*;
public class Example
{
public static void main(String[] args)
{
System.out.println("Matches: " + "abc".matches("a+"));
Matcher matcher = Pattern.compile("a+").matcher("abc");
System.out.println("Find: " + matcher.find());
}
}
Salida:
Matches: false
Find: true