Tengo esta expresión regular:
regex = /(Si.ges[a-zA-Z\W]*avec\W*fonction\W*m.moires)/iY cuando lo uso en algunos textos, pero no en todos, por ejemplo, este:
text = "xation de 2 sièges-enfants sur la banquette AR),Pack \"Assistance\",Keyless Access avec alarme : Système de verrouillage/déverrouillage et de démarrage sans clé,Park Assist: Système d'assistance au stationnement en créneauet et en bataille,Rear Assist: Caméra de recul avec visualisation de la zone situ" así: text.match(regex) , luego Ruby simplemente se ejecuta en lo que parece un bucle infinito, pero ¿por qué? ¿Y hay alguna forma de protegerse contra esto, por ejemplo, haciendo que Ruby arroje una excepción en su lugar, sin usar el tiempo de Timeout , ya que es un problema conocido cuando se usa con Sidekiq ( https://github.com/mperham/sidekiq/wiki/Problems- and-Troubleshooting#add-timeouts-to-everything )
versión rubí: 2.7.2
Las clases de caracteres incorporadas están más basadas en tablas.
Dado eso, los negativos incorporados como \W , \S , etc.
son difíciles para los motores fusionarse en una clase de carácter positivo.
En este caso, hay algunos errores obvios porque, como dijiste, no se agota el tiempo de espera.
algunas cadenas de destino.
De hecho, [a-xzA-XZ\W] funciona dada la cadena de muestra. Se agota el tiempo cuando se incluye Y en cualquier lugar
pero solo para esa cadena en particular.
Veamos si podemos determinar si esto es un error o no.
Primero, algunas pruebas:
Prueba - Reprobado [a-zA-Z\W]
https://rextester.com/FHUQG84843
# Test - Fail [a-zA-Z\W] puts "Hello World!"; regex = /(Si.ges[a-zA-Z\W]*avec\W*fonction\W*m.moires)/ui; text = "xation de 2 sièges-enfants sur la banquette AR),Pack \"Assistance\",Keyless Access avec alarme : Système de verrouillage/déverrouillage et de démarrage sans clé,Park Assist: Système d'assistance au stationnement en créneauet et en bataille,Rear Assist: Caméra de recul avec visualisation de la zone situ"; res = text.match(regex); puts "Done";Prueba - Aprobado [a-xzA-XZ\W]
https://rextester.com/RPV28606
Prueba - Pasar [a-zA-Z\P{Palabra}]
https://rextester.com/DAMW9069
Conclusión: Informe esto como un ERROR.
En mi opinión, este es un ERROR con su clase incorporada \W que está definida por el motor,
ya que \P{Word} es una función definida por propiedades Unicode, no un rango.
Y vemos que [a-zA-Z\P{Word}] funciona bien.
Utilice \P{Word} dentro de las clases como una solución temporal.
En realidad, cuando se diseñaron por primera vez los motores modernos, la lógica de lo que
una clase negativa era [^] cada elemento es Y NO que cuando se combina con un positivo
la clase donde cada elemento está en OR da como resultado errores en el alcance.
Perl tuvo errores de clase hace poco tiempo.