Soy un novato en expresiones regulares, y no puedo entender cómo escribir una sola expresión regular que "coincida" con cualquier palabra consecutiva duplicada, como:
París en la primavera.
No es que eso esté relacionado.
¿Por qué te ríes? ¿ Mis expresiones regulares son TAN malas?
¿Existe una sola expresión regular que coincida con TODAS las cadenas en negrita anteriores?
regex
duplicates
capture-group
Joshua
fuente
fuente
not that that is related
->not that is related
)? Gracias de antemano\1
!\b(\w+)\s+(\1\s*)+\b
?Respuestas:
Prueba esta expresión regular:
Aquí
\b
hay un límite de palabras y hace\1
referencia a la coincidencia capturada del primer grupo.fuente
\0
también? (Dónde\0
está toda la expresión regular, hasta el punto actual O dónde se\0
refiere a toda la expresión regular)Creo que esta expresión regular maneja más situaciones:
Puede encontrar una buena selección de cadenas de prueba aquí: http://callumacrae.github.com/regex-tuesday/challenge1.html
fuente
<strong>\0</strong>
pero no funcionó.$1 <strong>$2</strong>
. Pero también use diferentes expresiones regulares/\b(\S+) (\1)\b/gi
. Aquí hay un enlace: callumacrae.github.io/regex-tuesday/…<p class="bebe">bla bla</p>
¿cómo puedo integrar esta fórmula de expresiones regulares?Prueba esto con RE a continuación
() * Repitiendo de nuevo
fuente
La biblioteca PCRE ampliamente utilizada puede manejar tales situaciones (sin embargo, no logrará lo mismo con los motores de expresiones regulares compatibles con POSIX):
fuente
\W+
.\b
no lo hará, porque no consume ningún carácter.... the these problems...
. Esta solución no es tan confiable como la estructura general del patrón de Gumbo que implementa suficientemente los límites de las palabras.<p class="bebe">bla bla</p>
¿cómo puedo integrar esta fórmula de expresiones regulares?Esta es la expresión regular que utilizo para eliminar frases duplicadas en mi bot de twitch:
(\S+\s*)
busca cualquier cadena de caracteres que no sea un espacio en blanco, seguido de un espacio en blanco.\1{2,}
luego busca más de 2 instancias de esa frase en la cadena para que coincida. Si hay 3 frases idénticas, coincide.fuente
\s*
en el grupo de captura. Vea esta demostración: regex101.com/r/JtCdd6/1I said "oioioi" that's some wicked mistressship!
enoioioi
ysss
La siguiente expresión debería funcionar correctamente para encontrar cualquier número de palabras consecutivas. La coincidencia puede ser insensible a mayúsculas y minúsculas.
Entrada de muestra: Adiós, adiós GooDbYe
Salida de muestra: Adiós
Explicación:
La expresión regex:
\ b: Inicio de un límite de palabras
\ w +: cualquier número de caracteres de palabra
(\ s + \ 1 \ b) *: Cualquier número de espacio seguido de una palabra que coincida con la palabra anterior y finalice el límite de la palabra. Todo envuelto en * ayuda a encontrar más de una repetición.
Agrupación:
m.group (0): Debe contener el grupo correspondiente en el caso anterior Adiós, adiós GooDbYe
m.group (1): Debe contener la primera palabra del patrón coincidente en el caso anterior Adiós
El método de reemplazo reemplazará todas las palabras coincidentes consecutivas con la primera instancia de la palabra.
fuente
No. Esa es una gramática irregular. Puede haber expresiones regulares específicas del lenguaje / motor que puede usar, pero no existe una expresión regular universal que pueda hacer eso.
fuente
Aquí hay uno que captura varias palabras varias veces:
fuente
<p class="bebe">bla bla</p>
¿cómo puedo integrar esta fórmula de expresiones regulares?<p class="bebe">.*?\b\s+(\w+)\b\K\s+\1\s+\b(?=.*?<\/p>)
Regex to Strip 2+ palabras duplicadas (palabras consecutivas / no consecutivas)
Pruebe esta expresión regular que puede capturar 2 o más palabras duplicadas y solo dejar una sola palabra. Y las palabras duplicadas ni siquiera necesitan ser consecutivas .
Aquí,
\b
se usa para Word Boundary,?=
se usa para una búsqueda anticipada positiva y\1
se usa para referencias hacia atrás.Fuente de ejemplo
fuente
"the cat sat on the mat"
->" cat sat on the mat"
El ejemplo en Javascript: The Good Parts se puede adaptar para hacer esto:
\ b usa \ w para los límites de las palabras, donde \ w es equivalente a [0-9A-Z_a-z]. Si no le importa esa limitación, la respuesta aceptada está bien.
fuente
Dado que algunos desarrolladores están llegando a esta página en busca de una solución que no solo elimine las subcadenas consecutivas duplicadas que no sean espacios en blanco, sino también las triplicadas y más, mostraré el patrón adaptado.
Patrón:
/(\b\S+)(?:\s+\1\b)+/
( Demostración de patrón )Reemplazar:
$1
(reemplaza la coincidencia de cadena completa con el grupo de captura n. ° 1)Este patrón coincide codiciosamente con una subcadena "completa" que no es un espacio en blanco, luego requiere una o más copias de la subcadena coincidente que puede estar delimitada por uno o más caracteres de espacio en blanco (espacio, tabulación, nueva línea, etc.).
Específicamente:
\b
Los caracteres (límite de palabras) son vitales para garantizar que las palabras parciales no coincidan.+
(uno o más cuantificadores) en el grupo de no captura es más apropiado*
porque*
"molestará" al motor de expresiones regulares para capturar y reemplazar ocurrencias de singleton - este es un diseño de patrón derrochador.* tenga en cuenta que si se trata de frases o cadenas de entrada con puntuación, el patrón deberá perfeccionarse aún más.
fuente
Esta expresión (inspirada en Mike, arriba) parece capturar todos los duplicados, triplicados, etc., incluidos los que están al final de la cadena, lo que la mayoría de los demás no hacen:
Sé que la pregunta se hace para hacer coincidir solo los duplicados , pero un triplicado son solo 2 duplicados uno al lado del otro :)
Primero, me
(^|\s+)
aseguro de que comience con una palabra completa, de lo contrario "filete de niño" iría a "filete de niño" (las "s" coincidirían). Luego, coincide con todas las palabras completas ((\b\S+\b)
), seguidas de un final de cadena ($
) o varios espacios (\s+
), el conjunto se repite más de una vez.Lo probé así y funcionó bien:
fuente
\b
al final así:/(^|\s+)(\S+)(($|\s+)\2)+\b/g, "$1$2")
Esto funcionará para situaciones como esta:the the string String string stringing the the along the the string
se convertirá enthe string stringing the along the string
Avisostring stringing
. Se empareja con tu respuesta. Gracias.Use esto en caso de que desee una verificación que no distinga entre mayúsculas y minúsculas para detectar palabras duplicadas.
fuente