¿Cómo hacer coincidir "cualquier personaje" en expresión regular?


305

Lo siguiente debe coincidir:

AAA123
ABCDEFGH123
XXXX123

puedo hacer: ".*123"?


2
Este enlace muestra un enfoque que parece funcionar -> [^] + Lo que significa 'no coincide con ningún carácter', un doble negativo que puede volver a leerse como 'coincidir con cualquier carácter'. Fuente - loune.net/2011/02/…
HockeyJ

Respuestas:


645

Sí tu puedes. Eso debería funcionar.

  • . = cualquier char
  • \. = el carácter de punto real
  • .?= .{0,1}= coincide con cualquier carácter cero o una vez
  • .*= .{0,}= coincide con cualquier carácter cero o más veces
  • .+= .{1,}= coincide con cualquier personaje una o más veces

22
No siempre punto es significa cualquier char. Excepción cuando el modo de línea única. \ p {all} debería ser
marciano

¿Cómo puedes incluir una barra diagonal hacia atrás en esta lista de personajes?
Resultados de la búsqueda Resultados web Pi

1
@pippilongstocking La barra invertida es `\\`
Poutrathor

58

Sí, eso funcionará, aunque tenga en cuenta que .no coincidirá con las nuevas líneas a menos que pase el indicador DOTALL al compilar la expresión:

Pattern pattern = Pattern.compile(".*123", Pattern.DOTALL);
Matcher matcher = pattern.matcher(inputStr);
boolean matchFound = matcher.matches();

11
Esa es una información muy útil! Supuse .que coincidiría con las nuevas líneas. Me alegra haber leído tu respuesta, ¡necesito usar eso!
Ben Kane

Es posible que a veces también necesite hacer coincidir nuevas líneas en expresiones regulares de Java en contextos donde no puede pasar Pattern.DOTALL, como cuando se realiza una búsqueda de expresiones regulares de varias líneas en Eclipse, o como usuario de cualquier aplicación Java que ofrezca búsqueda de expresiones regulares. Según la guía de regular-expression.info , es posible que deba usar {.,\n,\r,\u2028,\u2029,\u0085}para que coincida absolutamente con cualquier carácter (los caracteres Unicode son caracteres adicionales de terminación de línea agregados que no coinciden .en Java), pero solo {.,\n,\r}funcionarían para la mayoría de los archivos de texto.
Theodore Murdock el

8
@TheodoreMurdock [\s\S]es una forma popular de emparejar cualquier personaje si no puedes usar DOTALL.
mpen

En caso de que se le ocurra , NO lo use (?:.|\\v)*, debido a JDK-6337993 .
Olivier Cailloux

22

Use el patrón .para que coincida con cualquier personaje una vez, .*para que coincida con cualquier personaje cero o más veces, .+para que coincida con cualquier personaje una o más veces.


11

Hay muchas herramientas sofisticadas de prueba y desarrollo de expresiones regulares, pero si solo quieres un arnés de prueba simple en Java, aquí tienes uno para que juegues:

    String[] tests = {
        "AAA123",
        "ABCDEFGH123",
        "XXXX123",
        "XYZ123ABC",
        "123123",
        "X123",
        "123",
    };
    for (String test : tests) {
        System.out.println(test + " " +test.matches(".+123"));
    }

Ahora puede agregar fácilmente nuevos casos de prueba y probar nuevos patrones. Diviértete explorando expresiones regulares.

Ver también


1
Vota solo por el enlace regular-expressions.info. Maravilloso sitio para aprender expresiones regulares y como referencia.
Freiheit

9

No, *coincidirá con cero o más caracteres. Debe usar +, que coincide con uno o más en su lugar.

Esta expresión podría funcionar mejor para usted: [A-Z]+123


1
Vota a favor aquí. El OP no especificó, pero parece correcto agregar que el patrón coincidirá con cualquier carácter, incluidos elementos como ### 123, 123123,% $ # 123 que el OP puede no querer. La clase de caracteres que @Huusom usa arriba hará que todos los OP utilicen solo caracteres alfabéticos en mayúsculas, que pueden haber sido la intención.
techdude

9

La forma más común que he visto para codificar esto es con una clase de caracteres cuyos miembros forman una partición del conjunto de todos los caracteres posibles.

Por lo general, la gente escribe que a medida [\s\S](espacio en blanco o no está en blanco), sin embargo [\w\W], [\d\D], etc haría todo el trabajo.


2
Como referencia, de regular-expressions.info/dot.html : "JavaScript y VBScript no tienen una opción para hacer que los puntos coincidan con los caracteres de salto de línea. En esos idiomas, puede usar una clase de caracteres como [\ s \ S] para que coincida con cualquier carácter. Este carácter coincide con un carácter que es un espacio en blanco (incluidos los caracteres de salto de línea) o un carácter que no es un carácter de espacio en blanco. Dado que todos los caracteres son espacios en blanco o no, esta clase de caracteres coincide con cualquier carácter ".
Dean o el

7

.*y .+son para cualquier carácter excepto para nuevas líneas.

Doble escape

En caso de que desee incluir nuevas líneas, las siguientes expresiones también podrían funcionar para aquellos lenguajes que requieren doble escape, como Java o C ++:

[\\s\\S]*
[\\d\\D]*
[\\w\\W]*

por cero o más veces, o

[\\s\\S]+
[\\d\\D]+
[\\w\\W]+

por una o más veces

Escapar individual:

No se requiere doble escape para algunos lenguajes como C #, PHP, Ruby, PERL, Python, JavaScript:

[\s\S]*
[\d\D]*
[\w\W]*
[\s\S]+
[\d\D]+
[\w\W]+

Prueba

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){

        final String regex_1 = "[\\s\\S]*";
        final String regex_2 = "[\\d\\D]*";
        final String regex_3 = "[\\w\\W]*";
        final String string = "AAA123\n\t"
             + "ABCDEFGH123\n\t"
             + "XXXX123\n\t";

        final Pattern pattern_1 = Pattern.compile(regex_1);
        final Pattern pattern_2 = Pattern.compile(regex_2);
        final Pattern pattern_3 = Pattern.compile(regex_3);

        final Matcher matcher_1 = pattern_1.matcher(string);
        final Matcher matcher_2 = pattern_2.matcher(string);
        final Matcher matcher_3 = pattern_3.matcher(string);

        if (matcher_1.find()) {
            System.out.println("Full Match for Expression 1: " + matcher_1.group(0));
        }

        if (matcher_2.find()) {
            System.out.println("Full Match for Expression 2: " + matcher_2.group(0));
        }
        if (matcher_3.find()) {
            System.out.println("Full Match for Expression 3: " + matcher_3.group(0));
        }
    }
}

Salida

Full Match for Expression 1: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 2: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 3: AAA123
    ABCDEFGH123
    XXXX123

Si desea explorar la expresión, se explica en el panel superior derecho de regex101.com . Si lo desea, también puede ver en este enlace cómo coincidiría con algunas entradas de muestra.


Circuito RegEx

jex.im visualiza expresiones regulares:

ingrese la descripción de la imagen aquí


1
¿No es eso ya respondido aquí? stackoverflow.com/a/55149095/5424988
El cuarto pájaro el

me gusta en (\W|\w)*lugar de doble escape
Sudip Bhattarai 03 de


5

Solución específica al problema de ejemplo: -

Trate [A-Z]*123$coincidirá 123, AAA123, ASDFRRF123. En caso de que necesite al menos un personaje antes de 123usarlo [A-Z]+123$.

Solución general a la pregunta (Cómo hacer coincidir "cualquier carácter" en la expresión regular):

  1. Si está buscando algo, incluido el espacio en blanco, puede intentarlo [\w|\W]{min_char_to_match,}.
  2. Si está intentando hacer coincidir algo, excepto los espacios en blanco, puede intentarlo [\S]{min_char_to_match,}.

2

[^]debe coincidir con cualquier carácter, incluida la nueva línea. [^CHARS] coincide con todos los caracteres excepto los de CHARS . Si CHARS está vacío, coincide con todos los caracteres.

Ejemplo de JavaScript:

/a[^]*Z/.test("abcxyz \0\r\n\t012789ABCXYZ") // Returns ‘true’.

¿Te importaría agregar algún código para hacernos saber lo que has intentado?
Jennis Vaishnav

1

Prueba la expresión regular .{3,}. Esto coincidirá con todos los caracteres excepto una nueva línea.


-4

Yo trabajo esto No siempre punto es significa cualquier char. Excepción cuando el modo de línea única. \p{all}debiera ser

String value = "|°¬<>!\"#$%&/()=?'\\¡¿/*-+_@[]^^{}";
String expression = "[a-zA-Z0-9\\p{all}]{0,50}";
if(value.matches(expression)){
    System.out.println("true");
} else {
    System.out.println("false");
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.