Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

347
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda