Patrón de expresiones regulares: permite números alfanuméricos, un montón de caracteres especiales, pero no una secuencia determinada de caracteres

StackOverflow https://stackoverflow.com/questions/429719

  •  06-07-2019
  •  | 
  •  

Pregunta

Tengo la siguiente expresión regular:

(?!^[&#]*$)^([A-Za-z0-9-'.,&@:?!()$#/\\]*)$

Entonces permita A-Z, a-Z, 0-9, y estos caracteres especiales '.,&@:?!()$#/\

No quiero coincidir si el siguiente conjunto de caracteres se encuentra en cualquier lugar de la cadena en este orden:

&#

Cuando ejecuto esta expresión regular con solo " & amp; # " como entrada, no coincide con mi patrón, me sale un error, genial. Cuando ejecuto la expresión regular con '., & Amp; @:?! () $ # / \ ABC123 Coincide con mi patrón, sin errores.

Sin embargo, cuando lo ejecuto con:

'.,&#@:?!()$#/\ABC123

Tampoco error. Estoy haciendo algo mal con la comprobación de la secuencia & amp; #.

¿Alguien puede decirme qué he hecho mal? No soy bueno con estas cosas.

¿Fue útil?

Solución

Tomando prestada una técnica para unir cadenas entre comillas, elimine & amp; de su clase de caracteres, agregue una alternativa para & amp; no seguido de < code> # , y permite que la cadena termine opcionalmente con & amp; :

  

^ ((?: [A-Za-z0-9 - '., @:?! () $ # / \\] + | & amp; [^ #]) * & amp;?) $

Otros consejos

Realmente lo haría en dos partes:

  1. Verifique su conjunto de caracteres permitido. Para hacer esto, buscaría caracteres que no están permitidos y devolvería false si hay una coincidencia. Eso significa que tengo una bonita expresión simple:
    [^A-Za-z0-9'\.&@:?!()$#^font>
  2. Verifique su subcadena prohibida. Y dado que es solo una subcadena, probablemente ni siquiera usaría una expresión regular para esa parte.

No mencionó su idioma, pero si está en C #:

bool IsValid(string input)
{
    return !(   input.Contains("&#")  
               || Regex.IsMatch(@"[^A-Za-z0-9'\.&@:?!()$#^]", input) 
            );
}

^ ((?! & amp; #) [A-Za-z0-9 - '., & amp; @:?! () $ # / \\]) * $

tenga en cuenta que el último \ se escapa (se duplica) SO convierte automáticamente \\ en \ si no está en backticks

Asumiendo RegExp compatible con Perl

Para no coincidir en la cadena '& amp; #':

  

(?! [^ & amp;] * & amp; #) ^ ([A-Za-z0-9 - '., & amp; @:?! () $ # / \\] *) $

Aunque no necesita el paréntesis porque está haciendo coincidir la cadena completa.

Solo para tu información, aunque la expresión regular de Ben Blank funciona, es más complicada de lo que debe ser. Lo haría así:

^(?:[A-Za-z0-9-'.,@:?!()$#/\\]+|&(?!#))+$

Debido a que usé un lookahead negativo en lugar de una clase de caracteres negada, la expresión regular no necesita ninguna ayuda adicional para hacer coincidir un ampersand al final de la cadena.

Recomiendo usar dos expresiones regulares en condicional:

    if (string has sequence "&#")
      return false
    else
      return (string matches sequence "A-Za-z0-9-'.,&@:?!()$#/\")

Creo que tu segundo " principal " expresión regular de

^([A-Za-z0-9-'.,&@:?!()$#/\])
^[A-Za-z0-9-'.,&@:?!()$#/\\]+$
quot;

tiene varios errores:

  • Solo probará un personaje en su conjunto
  • El carácter \ en expresiones regulares es un token que indica que el siguiente carácter es parte de algún tipo de " clase " de caracteres (por ejemplo, \ n = es el carácter de avance de línea). La secuencia de caracteres \] en realidad está causando que su lista entre corchetes no se termine.

Puede que sea mejor usar

<*>

Tenga en cuenta que el carácter de barra diagonal está representado por una barra doble.

El carácter + indica que al menos un carácter que se está probando debe coincidir con la expresión regular; si está bien pasar una cadena de longitud cero, reemplace el + con un * .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top