La expresión regular simple falla con stackoverflow en una cadena grande en Scala / Java

Necesito una expresión regular que compruebe si es una cadena entre comillas (por ') con posibles escapes \' dentro. Por lo tanto, se me ocurren las siguientes expresiones regulares, \'(\\.|[^\'])*\'.

"""\'(\\.|[^\'])*\'""".r.findFirstIn(s"'${"a"*100}'")

que funciona perfectamente en cadenas pequeñas, pero falla con stack overflowun tamaño> 3000 bytes.

"""\'(\\.|[^\'])*\'""".r.findFirstIn(s"'${"a"*5000}'")

Esto es fragmentos de Scala. Internamente se ejecuta java.util.regex, por lo que es un problema java / jvm.

En mi conocimiento, esas expresiones regulares simples no deberían causar stack overflow, es un DFA / NFA simple sin ninguna recursión en su interior.

¿Cómo solucionar este problema?

Necesito expresiones regulares para eso (esto es parte del código del analizador-analizador, no puedo simplemente escribir código personalizado que verifique la propiedad).

¿Por qué hay recursión adentro?

Respuesta 1

Puede probar la técnica clásica Desenrollar el bucle descrita por J. Friedl:

'                              # the start delimiter
 ([^\\']*                      # anything but the end of the string or the escape char
         (?:\\.                #     the escape char preceding an escaped char (any char)
               [^\\']*         #     anything but the end of the string or the escape char
                      )*)      #     repeat
                             ' # the end delimiter

Regex101 Demo

Respuesta: 2

Estoy creando una CustomizableIntroPart para mi aplicación Eclipse. Defino mis páginas usando XHTML que funciona bien. Pero manejar imágenes está causando algunos problemas. Genero mi contenido usando ...

Utilizo una cadena Base64 para guardar mi imagen y quiero convertirla en un mapa de bits en Android. El problema es que la vista de imagen es negra en el área inferior. También lo intenté con otras imágenes, pero estoy ...

Estoy haciendo mi proyecto "Sistema de reemplazo facial" en Java. Para eso, primero debo verificar si una imagen está subexpuesta o sobreexpuesta, y aclararla o hacerla menos brillante, respectivamente. Hay un ...

Tengo un applet ejecutándose en una pestaña del navegador. Cuando cambio a una pestaña diferente en el mismo navegador, o ALT-TAB a otra aplicación por completo, el applet pierde el foco. Cuando vuelvo a la pestaña del navegador, ...