Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

340
Views
¿Es esto un error en Ruby Regexp? ¿Cómo protegerse contra el "bucle infinito" de la coincidencia de expresiones regulares sin usar el tiempo de espera?

Tengo esta expresión regular:

 regex = /(Si.ges[a-zA-Z\W]*avec\W*fonction\W*m.moires)/i

Y 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

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!