solo regulares regular probar letras expresiones expresion especiales espacios espacio ejemplos cualquier caracteres caracter blanco regex

regex - probar - expresiones regulares java



Regex para detectar una de varias cadenas (7)

No necesita una expresión regular para encontrar si una cadena contiene al menos una de una lista dada de subcadenas. En Python:

def contain(string_, substrings): return any(s in string_ for s in substrings)

Lo anterior es lento para una string_ y muchas subcadenas. GNU fgrep puede buscar eficientemente múltiples patrones al mismo tiempo.

Usando regex

import re def contain(string_, substrings): regex = ''|''.join("(?:%s)" % re.escape(s) for s in substrings) return re.search(regex, string_) is not None

Relacionado

Tengo una lista de direcciones de correo electrónico que pertenecen a varios dominios. Me gustaría una expresión regular que coincida con las direcciones que pertenecen a tres dominios específicos (para este ejemplo: foo, bar, y baz)

Entonces estos coincidirían:

  1. a @ foo
  2. un bar
  3. b @ baz

Esto no:

  1. a @ fnord

Idealmente, estos tampoco coincidirían (aunque no es crítico para este problema en particular):

  1. a @ foobar
  2. b @ foofoo

Resumiendo un poco el problema: quiero hacer coincidir una cadena que contenga al menos una de una lista dada de subcadenas.


Ok, sé que pediste una respuesta regular. Pero ¿ha considerado simplemente dividir la cadena con el carácter ''@'' tomando el segundo valor de matriz (el dominio) y haciendo una prueba de coincidencia simple

if (splitString[1] == "foo" && splitString[1] == "bar" && splitString[1] == "baz") { //Do Something! }

Me parece que RegEx es excesivo. Por supuesto, mi suposición es que su caso es realmente tan simple como lo ha enumerado.


Si las respuestas anteriores (y lógicas) sobre ''|'' no te sienta bien, echa un vistazo a

http://metacpan.org/pod/Regex::PreSuf

descripción del módulo: crear expresiones regulares a partir de listas de palabras


Use el símbolo de tubería para indicar "o":

/a@(foo|bar|baz)/b/

Si no desea el grupo de captura, use el símbolo de agrupamiento que no captura:

/a@(?:foo|bar|baz)/b/

(Por supuesto, supongo que " a " está bien para el frente de la dirección de correo electrónico. Debe reemplazarlo con una expresión regular adecuada).


Utilizar:

/@(foo|bar|baz)/.?$/i

Tenga en cuenta las diferencias de otras respuestas:

  • /.? - haciendo coincidir 0 o 1 punto, en caso de que los dominios en la dirección de correo electrónico estén "totalmente calificados"
  • $ - para indicar que la cadena debe terminar con esta secuencia,
  • /i - para hacer que la prueba sea insensible.

Tenga en cuenta que esto supone que cada dirección de correo electrónico está en una línea independiente.

Si la cadena que coincide puede estar en cualquier lugar de la cadena, suelte $ y reemplácela con /s+ (que coincide con uno o más caracteres de espacio en blanco)


debería ser más genérico, el a no debería contar, aunque el @ debería.

/@(foo|bar|baz)(?:/W|$)/

Here hay una buena referencia en regex.

editar: cambio final para permitir el final del patrón o salto de palabra. ahora suponiendo que foo / bar / baz son nombres de dominio completo.


^(a|b)@(foo|bar|baz)$

si tiene esta fuertemente definida una lista. Los caracteres de inicio y final solo buscarán esas tres cadenas.