Combine Regexp?

Después de recostackr la información del usuario para diversas condiciones, como

  1. Comienza con: /(^@)/
  2. Termina con: /(@$)/
  3. Contiene: /@/
  4. No contiene

Para hacer una expresión regular solo si el usuario ingresa varias condiciones, las combino con "|" así que si 1 y 2 dado se convierten en /(^@)|(@$)/

Este método funciona hasta ahora, pero

No puedo determinar correctamente, ¿qué debería ser regex para 4 la condición? ¿Y combinar expresiones regulares de esta manera funciona?


Actualización: @ (entrada del usuario) no será el mismo para dos condiciones y no las cuatro condiciones siempre presentes, pero pueden serlo y en el futuro podría necesitar más condiciones como “es exactamente” y “no es exactamente así”, etc. ¿Tengo más curiosidad por saber que este enfoque escalará?

También puede haber problemas de limpieza de entrada del usuario, por lo que la expresión regular se escapó correctamente, pero eso se ignora en este momento.

¿Las condiciones serán ORed o ANDed juntas?

  Comienza con: abc
 Termina con: xyz
 Contiene: 123
 No contiene: 456 

La versión OR es bastante simple; como dijiste, es principalmente una cuestión de insertar tuberías entre condiciones individuales. La expresión regular simplemente deja de buscar una coincidencia tan pronto como una de las alternativas coincida.

 /^abc|xyz$|123|^(?:(?!456).)*$/ 

Esa cuarta alternativa puede parecer extraña, pero así es como expresas “no contiene” en una expresión regular. Por cierto, el orden de las alternativas no importa; esto es efectivamente el mismo regex:

 /xyz$|^(?:(?!456).)*$|123|^abc/ 

La versión AND es más complicada. Después de que cada expresión regular individual coincida, la posición del partido debe restablecerse a cero para que la próxima expresión regular tenga acceso a toda la entrada. Eso significa que todas las condiciones deben expressse como lookaheads (técnicamente, uno de ellos no tiene que ser un vistazo, creo que expresa la intención más claramente de esta manera). Un final .*$ Consum el partido.

 /^(?=^abc)(?=.*xyz$)(?=.*123)(?=^(?:(?!456).)*$).*$/ 

Y luego está la posibilidad de combinar condiciones AND y OR, ahí es donde comienza la verdadera diversión. :RE

No contiene @: / (^ [^ @] * $) /

La combinación de trabajos si el resultado previsto de la combinación es que alguno de ellos coincide resultados en toda la correspondencia de expresiones regulares.

Si una cadena no debe contener @ , cada carácter debe ser otro que @ .

 /^[^@]*$/ 

Esto coincidirá con cualquier cadena de cualquier longitud que no contenga @ .

Otra posible solución sería invertir el resultado booleano de /@/ .

1 + 2 + 4 condiciones: comienza | termina, pero no en el medio

  /^@[^@]*@?$|^@?[^@]*@$/ 

es casi lo mismo que:

  /^@?[^@]*@?$/ 

pero este combina cualquier cadena sin @, sample ‘my name is hal9000’

En mi experiencia con Regex, realmente necesitas enfocarte en lo que EXACTAMENTE estás tratando de hacer coincidir, en lugar de lo que NO debes hacer.

por ejemplo \ d {2}

[1-9] [0-9]

La primera expresión coincidirá con 2 dígitos … y la segunda coincidirá con 1 dígito de 1 a 9 y 1 dígito, cualquier dígito. Entonces, si escribe 07, la primera expresión lo validará, pero el segundo no.

Ver esto para referencia avanzada:

http://www.regular-expressions.info/refadv.html

EDITADO:

^((?!my string).)*$ Es la expresión regular para no contiene “mi cadena”.

La combinación de la expresión regular para la cuarta opción con cualquiera de las otras no funciona dentro de una expresión regular. 4 + 1 significa que la cadena comienza con @ o no contiene @ en absoluto. Necesitarás dos comparaciones separadas para hacer eso.