siguiente cadena provoca PatternSyntaxException
:PatternSyntaxException
Pattern.compile("*\\.*");
Quiero crear un patrón para que pueda filtrar todos los archivos con el nombre de la siguiente forma: "*.*"
¿Cómo puedo hacer eso?
siguiente cadena provoca PatternSyntaxException
:PatternSyntaxException
Pattern.compile("*\\.*");
Quiero crear un patrón para que pueda filtrar todos los archivos con el nombre de la siguiente forma: "*.*"
¿Cómo puedo hacer eso?
para que coincida con todas las cuerdas con un .
en el nombre, lo hace :
Pattern.compile(".*[.].*");
descomponerlo:
.*
coinciden con cualquier número de caracteres arbitrarios[.]
coinciden con un punto. (Sí, \\.
funciona también).*
partido de cualquier número de caracteres arbitrariaDemostración:
Pattern p = Pattern.compile(".*[.].*");
System.out.println(p.matcher("hello.txt").matches()); // true
System.out.println(p.matcher("hellotxt").matches()); // false
Tenga en cuenta que la cadena con un solo punto, "."
partidos también. Para asegurarse de que tiene algunos caracteres delante y después del punto, puede cambiar el *
al +
: .+[.].+
.
La razón se obtiene PatternSyntaxException
:
*
El operador debe ser interpretado como "el carácter anterior repetido cero o más veces". Desde que comenzó su expresión con *
no había caracteres para repetir, por lo tanto, se lanzó una excepción.
Tal vez significaba:
Pattern.compile("\\*\\.\\*");
Si no es así, y medios asterisco 'cualquier carácter' entonces
Pattern.compile(".*\\..*");
Tienes que escribir:
Pattern.compile("\\*\\.\\*");
Debido *
tiene una especial significado (cero o más) en una expresión regular. Entonces tienes que escapar con un \\
.
Otra forma podría ser:
Pattern.compile("[*][.][*]");
porque *
pierde su otro significado cuando aparece entre [
y ]
.
Si desea analizar un nombre de archivo de formato *.*
, esto debería ser suficiente:
Pattern.compile(".+\\..+");
para que coincida con cualquier nombre de archivo (que puede o no puede tener una extensión) puede utilizar
Pattern.compile(".+(\\..+)?");
Si quieres decir, puedes cambiar los archivos con un punto "." en su nombre, utilice la siguiente:
Pattern.compile("[^\\.]*\\.[^\\.]*")
Pattern.compile(".*\\/.*\\..*");
uso de este pattern.It coincidirá con todos los nombres de archivo que se contiene un punto. Asterisk es un personaje especial. Significa que el símbolo que viene antes de *
puede ser 0 o más veces. Entonces no puedes escribirlo sin carácter antes.
Por ejemplo, para un nombre de archivo C:/folder.1/folder.2/file.txt
patrón funcionará de modo:
.*
- C:/folder.1/folder.2
(todo hasta que encuentra el último /
personaje)
\/
- /
carácter
.*
- file
(todo hasta que encuentra el último .
carácter (punto))
\\.
- .
(punto)
.*
- txt
(después de todo .
(en realidad la extensión de archivo))
El carácter *
tiene un significado diferente en expresiones regulares que cuando se usa en la línea de comando como comodín de archivo.Más información sobre la sintaxis de Java patrón de expresión regular se puede encontrar aquí: http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html
Esto se encuentra el texto que busca para que coincida con:
Pattern.compile(".*\\..*");
No hay necesidad de escapar del '.' en una clase de caracteres. – aioobe