Patrón de coincidencia de expresiones regulares de Java

Necesito verificar un patrón con algún texto (tengo que verificar si mi patrón está dentro de muchos textos).

Este es mi ejemplo

String pattern = "^[a-zA-Z ]*toto win(\\W)*[a-zA-Z ]*$";    
if("toto win because of".matches(pattern))
 System.out.println("we have a winner");
else
 System.out.println("we DON'T have a winner");

Para mi prueba, el patrón debe coincidir, pero el uso de mi expresión regular no coincide. Debe coincidir con :

" toto win bla bla"

"toto win because of"
"toto win. bla bla"


"here. toto win. bla bla"
"here? toto win. bla bla"

"here %dfddfd . toto win. bla bla"

No debe coincidir:

" -toto win bla bla"
" pretoto win bla bla"

Intento hacerlo usando mi expresión regular pero no funciona.

¿Puedes señalarme qué estoy haciendo mal?

preguntado el 12 de junio de 12 a las 09:06

sí hay quotes presentaría en la cadena de entrada? -

Puede ser cualquier cosa. Es un texto ordinario -

Haga no agregue firmas ni eslóganes a sus publicaciones. También has estado escribiendo mal "mucho". Hay un espacio entre "a" y "mucho". -

5 Respuestas

Esto funcionaría

(?im)^[?.\s%a-z]*?\btoto win\b.+$

Explicación

"(?im)" +         // Match the remainder of the regex with the options: case insensitive (i); ^ and $ match at line breaks (m)
"^" +             // Assert position at the beginning of a line (at beginning of the string or after a line break character)
"[?.\\s%a-z]" +    // Match a single character present in the list below
                     // One of the characters “?.”
                     // A whitespace character (spaces, tabs, and line breaks)
                     // The character “%”
                     // A character in the range between “a” and “z”
   "*?" +            // Between zero and unlimited times, as few times as possible, expanding as needed (lazy)
"\\b" +            // Assert position at a word boundary
"toto\\ win" +     // Match the characters “toto win” literally
"\\b" +            // Assert position at a word boundary
"." +             // Match any single character that is not a line break character
   "+" +             // Between one and unlimited times, as many times as possible, giving back as needed (greedy)
"$"               // Assert position at the end of a line (at the end of the string or before a line break character)

ACTUALIZACIÓN 1

(?im)^[?~`'!@#$%^&*+.\s%a-z]*? toto win\b.*$

ACTUALIZACIÓN 2

(?im)^[^-]*?\btoto win\b.*$

ACTUALIZACIÓN 3

(?im)^.*?(?<!-)toto win\b.*$

Explicación

"(?im)" +       // Match the remainder of the regex with the options: case insensitive (i); ^ and $ match at line breaks (m)
"^" +           // Assert position at the beginning of a line (at beginning of the string or after a line break character)
"." +           // Match any single character that is not a line break character
   "*?" +          // Between zero and unlimited times, as few times as possible, expanding as needed (lazy)
"(?<!" +        // Assert that it is impossible to match the regex below with the match ending at this position (negative lookbehind)
   "-" +           // Match the character “-” literally
")" +
"toto\\ win" +   // Match the characters “toto win” literally
"\\b" +          // Assert position at a word boundary
"." +           // Match any single character that is not a line break character
   "*" +           // Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
"$"             // Assert position at the end of a line (at the end of the string or before a line break character)

RegEx necesita escaparse para usar dentro del código

Respondido el 12 de junio de 12 a las 15:06

Esta cadena no coincide: "aquí! para ganar dfddfd" - CC.

En realidad puede haber cualquier personaje. Imagina un texto extraído de un sitio web. Podemos tener cualquier cosa. Lo que no puedo tener es algún texto/caracteres (excepto "-") pegados antes como "blatoto win" o "-toto win". - CC.

Estupendo. Hace lo que quiero. Muchas gracias. - CC.

Otra vez yo. Acabo de notar un error en esta expresión regular. Si tengo "-" antes de mi texto, incluso si el "-" no está pegado a mi texto como "- blabla toto win" sigue siendo rechazado. ¿Cómo pongo la condición con respecto al carácter "-" para rechazar solo si está pegado a mi texto? Gracias de nuevo. - CC.

Funciona a las mil maravillas. Muchísimas gracias. Es posible explicarme este patrón porque realmente no lo entiendo. - CC.

Solo cambia tu código a String pattern = "\\s*toto win[\\w\\s]*";

\W significa carácter sin palabra, \w significa carácter con palabra (a-zA-Z_0-9).

[\\w\\s]* coincidirá con cualquier número de palabras y espacios después de "toto win".

ACTUALIZACIÓN

Para reflejar sus nuevos requisitos, esta expresión funcionaría:

"((.*\\s)+|^)toto win[\\w\\s\\p{Punct}]*"

((.*\\s)+|^) coincide con cualquier cosa seguida por al menos un espacio O el comienzo de la línea.

[\\w\\s\\p{Punct}]* coincide con cualquier combinación de palabras, números, espacios y puntuaciones.

Respondido el 12 de junio de 12 a las 11:06

La siguiente expresión regular

^[a-zA-Z. ]*toto win[a-zA-Z. ]*$

Coincidirá

 toto win bla bla
toto win because of
toto win. bla bla

Y no coincide

-toto win bla bla"

Respondido el 12 de junio de 12 a las 10:06

Esto parece genial, pero una cadena como "toto win. bla bla" no funciona. Algunas ideas ? - CC.

Actualicé mis respuestas. En su pregunta menciona caracteres "especiales". Agregué el punto. a lo que consideres especial agregándolo a la clase de personaje. ¿Lo ves? Simplemente agregue según sea necesario. - Buckley

Yo lo veo. Acabo de actualizar mi pregunta. Todavía no funciona completamente. No sé tener ninguno de los dos personajes antes de mi patrón. - CC.

te falta espacio entre win y la siguiente palabra en tu patrón

prueba esto: \\stoto\\swin\\s\\w

http://gskinner.com/RegExr/ aquí puedes probar tus expresiones regulares

Respondido el 12 de junio de 12 a las 10:06

Quiere decir que tengo que tener un patrón de cadena = "(\\s)*toto win(\\s)*(\\W)*"; ? - CC.

Sería más fácil si incluyera los requisitos reales, no la lista de cosas para (no) coincidir. Tengo la fuerte sospecha de que "toto winabc" no debería coincidir, pero no estoy seguro, ya que no ha incluido ese ejemplo ni ha explicado los requisitos. De todos modos, esto funciona para todos sus ejemplos actuales:

static String[] matchThese = new String[] {
        " toto win bla bla",
        "toto win because of",
        "toto win. bla bla",
        "here. toto win. bla bla",
        "here? toto win. bla bla",
        "here %dfddfd . toto win. bla bla"
};

static String[] dontMatchThese = new String[] {
        " -toto win bla bla",
        " pretoto win bla bla"
};


public static void main(String[] args) {
    // either beginning of a line or whitespace followed by "toto win"
    Pattern p = Pattern.compile("(^|\\s)toto win");

    System.out.println("Should match:");
    for (String s : matchThese) {
        System.out.println(p.matcher(s).find());
    }

    System.out.println("Shouldn't match:");
    for (String s : dontMatchThese) {
        System.out.println(p.matcher(s).find());
    }
}

Respondido el 12 de junio de 12 a las 11:06

Di los ejemplos para mostrar qué tipo de texto debe coincidir. El texto puede ser cualquier cosa, por lo que no puedo usar su método. Gracias de cualquier manera. - CC.

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.