¿Cómo ignorar los espacios en blanco en una cadena de asunto de expresión regular?

¿Existe una manera simple de ignorar el espacio en blanco en una cadena de destino cuando se buscan coincidencias usando un patrón de expresión regular? Por ejemplo, si mi búsqueda es para “gatos”, me gustaría que coincida con “c ats” o “ca ts”. No puedo eliminar el espacio en blanco de antemano porque necesito encontrar el índice inicial y final de la coincidencia (incluidos los espacios en blanco) para resaltar esa coincidencia y cualquier espacio en blanco debe estar ahí para el formateo.

Puede insertar caracteres de espacio en blanco opcionales \s* entre cada uno de los otros caracteres en su expresión regular. Aunque se concede, será un poco largo.

/cats/ -> /c\s*a\s*t\s*s/

Dirigiendo el comentario de Steven a la respuesta de Sam Dufel

Gracias, parece que ese es el camino a seguir. Pero me acabo de dar cuenta de que solo quiero los caracteres opcionales de espacios en blanco si siguen una nueva línea. Por ejemplo, “c \ n ats” o “ca \ n ts” deben coincidir. Pero no querría que los “c ats” coincidan si no hay línea nueva. ¿Alguna idea sobre cómo se podría hacer eso?

Esto debería funcionar:

 /c(?:\n\s*)?a(?:\n\s*)?t(?:\n\s*)?s/ 

Consulte esta página para conocer las diferentes variaciones de ‘gatos’ que coinciden.

También puede resolver esto usando condicionales , pero no son compatibles con el sabor javascript de regex.

Podrías poner \s* entre cada personaje en tu cadena de búsqueda, así que si estuvieras buscando gato, usarías c\s*a\s*t\s*s\s*s

Es largo, pero podrías construir la cadena de forma dinámica, por supuesto.

Puede verlo trabajando aquí: http://www.rubular.com/r/zzWwvppSpE

Si solo quieres permitir espacios, entonces

 \bc *a *t *s\b 

Deberías hacerlo. Para permitir también tabs, use

 \bc[ \t]*a[ \t]*t[ \t]*s\b 

Quite los anclajes \b si también desea encontrar cats con palabras como cats bobcats o catsup .

Este enfoque se puede usar para automatizar esto (la siguiente solución ejemplar está en python, aunque obviamente se puede portar a cualquier idioma):

puede quitar los espacios en blanco de antemano Y guardar las posiciones de los caracteres que no sean espacios en blanco para que pueda usarlos más tarde para encontrar las posiciones de límites de cuerda coincidentes en la cadena original como la siguiente:

 def regex_search_ignore_space(regex, string): no_spaces = '' char_positions = [] for pos, char in enumerate(string): if re.match(r'\S', char): # upper \S matches non-whitespace chars no_spaces += char char_positions.append(pos) match = re.search(regex, no_spaces) if not match: return match # match.start() and match.end() are indices of start and end # of the found string in the spaceless string # (as we have searched in it). start = char_positions[match.start()] # in the original string end = char_positions[match.end()] # in the original string matched_string = string[start:end] # see # the match WITH spaces is returned. return matched_string with_spaces = 'a li on and a cat' print(regex_search_ignore_space('lion', with_spaces)) # prints 'li on' 

Si desea ir más allá, puede construir el objeto de coincidencia y devolverlo en su lugar, por lo que el uso de este ayudante será más útil.

Y el rendimiento de esta función también puede optimizarse, este ejemplo es solo para mostrar el camino a una solución.