java - tutorial - ¿Cómo puedo usar la misma expresión regular en diferentes lenguajes de programación?
probar expresiones regulares java (3)
Los dialectos que mencionaste implícitamente en tu publicación no son TAN diferentes, hay cosas que son compatibles con uno y no con los otros, pero que normalmente no causarán ningún problema a menos que estés escribiendo expresiones regulares que en realidad estén dirigidas específicamente a uno de los dialectos. en cuestión.
Puede ver las diferencias entre los dialectos en la tabla disponible en el siguiente enlace:
La principal diferencia entre ellos son las características más "avanzadas" de las expresiones regulares. Si no usas estos, estarás en la zona segura.
Ya que tanto python como java tienen módulos disponibles para ejecutar javascript nativo, puede decir que todas las expresiones deben escribirse para javascript y luego hacer que los futuros desarrolladores utilicen el módulo disponible para ellos, para asegurarse de que regexp se ejecute siempre de la misma manera. .
Aunque solo documentaría su aplicación diciendo que cualquier expresión regular utilizada debe ser compatible con los tres idiomas, y luego dirigirla a una tabla (como la que estaba vinculada anteriormente) y decir que deberían buscar lo que está disponible para usar.
..o podría compilar una lista / tabla de su propio.
He visto esta pregunta y sé por experiencia que todos los idiomas parecen admitir un dialecto diferente de expresiones regulares. Me imagino que el problema ha existido durante mucho tiempo, por lo que alguien debe haber querido hacer algo al respecto.
Tengo un proyecto bastante grande que involucra JavaScript, Ruby y Java, y todos tienen que tocar las mismas expresiones regulares. Elegimos a Java como nuestro intérprete "oficial" de RE, lo que significa que cada vez que los otros dos idiomas necesitan evaluar un RE, tienen que pasarlo de alguna manera a un programa de Java, y eso está empezando a generar muchos gastos generales.
Si pudiera elegir cualquier dialecto RE e invocar eso al menos de forma nativa desde todos los idiomas, sería un gran paso para nosotros. es posible? ¿Se está haciendo ya? Miramos a PCRE, y es técnicamente posible invocarlo a través de enlaces nativos de Java y Ruby (aunque deja a JS en el frío), pero no he encontrado a nadie que lo haga. ¿Estamos solos?
ETA: un problema que no mencioné es que este sistema aplica expresiones regulares proporcionadas por el usuario . (Sí, entiendo que este es un problema de seguridad , etc., pero es para uso interno por parte de usuarios confiados y atribuidos). Ciertamente, puedo sugerir que se presente una lista de características de poder "no hacer esto" para evitar, Pero espero que no sea la mejor solución.
Los dialectos son todos ligeramente diferentes, pero se superponen en casi todos los puntos principales. (Las diferencias principales se encuentran en no en las expresiones regulares en sí mismas, sino en cómo se las llama (la find
un idioma es la matches
de otro, etc.) y en el soporte para los literales de expresión regular (la cadena en bruto de otro idioma es la cadena en bruto de otro es la cadena de barras inversas de otro. ).)
En lugar de obtener JavaScript para soportar las peculiaridades de Java y viceversa, creo que probablemente sea mejor que se limiten al enorme subconjunto de expresiones regulares que son comunes entre los tres idiomas, y que utilicen pruebas unitarias para asegurarse de que sus expresiones regulares se comporten correctamente. igual en los tres.
Una opción (de peso pesado) sería construir un "compilador cruzado de expresiones regulares" que podría aceptar como entrada una expresión regular escrita en alguna forma canónica (por ejemplo, como una expresión regular de Perl), luego la escanearía y analizaría en un árbol de sintaxis y generar expresiones regulares equivalentes para otros idiomas (por ejemplo, Python o Java). Esto le permitiría escribir la expresión regular una vez y hacer que funcione en todas partes, ya que el compilador hará todo el trabajo de conversión entre formatos.
¡Espero que esto ayude!