Diferencia de expresiones regulares en python y google app script (¿motor de backend relacionado?)

Intenté la misma expresión regular tanto en python (3.6, jupyter notebook) como en el script de aplicación de Google, pero parece que el “grupo que no captura” no funciona en el caso del script de aplicación.

# python script: import re text='' regex='(?:)' match=re.search(regex,text) print(match.group(1)) # result is 'SOisAwesome@hello.edu' // Google app script function myFunction() { string='' regex=new RegExp('(?:)') Match=regex.exec(string) Logger.log(Match[1]) // result is 'a class=""email"" href=""mailto:SOisAwesome@hello.edu' } 

Si no me equivoco, el motor de expresiones regulares en el script de la aplicación Google debería admitir grupos que no capturan (refiriéndose a https://en.wikipedia.org/wiki/Comparison_of_regular_expression_engines , supongo que debería estar viendo “JavaScript (ECMAScript)” y “Grupos tímidos”? ¿Puede alguien explicar lo que me estoy perdiendo aquí?

¡Gracias por adelantado!

En primer lugar, necesitas usar \\ antes . en la statement de expresiones regulares de GAS, ya que la barra invertida literal forma una secuencia de escape de expresiones regulares.

Ahora, parece que la implementación del grupo no capturador de GAS está defectuosa.

Si ejecuta su expresión regular en GAS e imprime el objeto Match , verá

 [18-01-26 08:49:07:198 CET] [, a class=""email"" href=""mailto:SOisAwesome@hello.edu, "">] 

Eso significa que el grupo que no capturó se “fusionó” con el primer grupo que capturó saltándose el primer carácter .

Aquí hay algunos experimentos más:

 Logger.log(new RegExp("(?:;\\w+):(\\d+)").exec(";er:34")); // = null, expected [;er:34, 34] Logger.log(new RegExp("(?:e\\w+):(\\d+)").exec(";er:34")); // = null, expected [er:34, 34] Logger.log(new RegExp("(?:\\w+):(\\d+)").exec(";er:34")); // = [er:34, 34], as expected 

Para solucionar el problema, puede eliminar los paréntesis que no capturan, como \d = (?:\d) .