Pregunta

Estoy queriendo para que coincidan con una lista de palabras que es bastante fácil cuando esas palabras son verdaderamente palabras.Por ejemplo /\b (pop|push) \b/gsx cuando iba en contra de la cadena

pop le dio con la puerta de un empujón, pero se apareció a la espalda

se coincide con las palabras del pop y push, pero no apareció.

Necesito una funcionalidad similar para las palabras que contienen caracteres que normalmente se califican como de los límites de la palabra.Así que necesito /\b (reverse!|push) \b/gsx cuando iba en contra de la cadena

empuje inverso!inversa!empuje

a sólo partido inversa!y empujón, pero no coincide con la inversa!de empuje.Obviamente, esta expresión no va a hacerlo, así que ¿qué necesito para usar en lugar de \b para hacer mi regex lo suficientemente inteligente como para manejar estos funky requisitos?

¿Fue útil?

Solución

Al final de una palabra, \ b significa "el carácter anterior era un carácter de palabra, y el carácter siguiente (si hay un siguiente carácter) no es un carácter de palabra. Ahora desea descartar la primera condición porque puede ser un carácter no-palabra al final de la "palabra" que te deja con una búsqueda negativa hacia delante:.

/\b (reverse!|push) (?!\w)/gx

Estoy bastante seguro de expresiones regulares compatibles con AS3 búsqueda hacia delante.

Otros consejos

Su primer problema es que se necesitan tres (posiblemente cuatro) de los casos en su alternancia, no dos.

  • /\breverse!(?:\s|$)/ revertir! por sí mismo
  • /\bpush\b/ empuje por sí mismo
  • /\breverse!push\b/ juntos
  • /\bpushreverse!(?:\s|$)/ este es el caso posible

Su segundo problema es que un \b no coincidirá después de un "!" porque no es un \w. Esto es lo que Perl 5 tiene que decir acerca de \b , es posible que desee consultar sus documentos para ver si están de acuerdo:

  

A límite de palabra ( "\ b") es un punto entre dos caracteres que tiene una "\ w" en una cara de la misma y un "\ W" en el otro lado de la misma (en cualquier orden), contando el personajes imaginarios fuera el principio y el final de la cadena como un juego "\ W". (Dentro de las clases de caracteres "\ b" representa la tecla de retroceso en lugar de un límite de palabra, al igual que lo hace normalmente en cualquier cadena entre comillas dobles.)

Por lo tanto, la expresión regular que se necesita es algo así como

/ \b ( reverse!push | reverse! | push ) (?: \s | \b | $ )+ /gx;

Me fui a cabo la /s porque no hay períodos en esta expresión regular, por lo tratan como una sola línea que no tiene sentido. Si /s no significa tratar como una sola línea en su motor probablemente debería volver a agregarlo. También, usted debe leer sobre cómo su motor se encarga de la alternancia. Sé que en Perl 5 para obtener el comportamiento correcto debe organizar los elementos de esta manera (de lo contrario revertir! Sería siempre ganarse a revertir! Empujar).

Puede reemplazar \ b por algo equivalente, pero menos estricta:

/(?<=\s|^)(reverse!|push)(?=\s|$)/g

De esta manera se elimina el factor limitante de la \b (que sólo puede igualar antes o después de un carácter real palabra \w).

Ahora el espacio en blanco o el inicio / final de la función de cadena separadores como válidos, y la expresión interna pueden ser fácilmente construidas en tiempo de ejecución, de una lista de términos de búsqueda, por ejemplo.

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