内部的一个系统,正则表达式是用户输入的,然后为了方便用户校验,页面上用js做了一个简单的校验小工具,实际底层运行的时候,是有一个golang监控程序和一个cpp主程序来使用这些正则表达式对字符串进行匹配的。

问题也就出在这些跨语言的行为上了,昨天突然告警,该匹配的没匹配上,赶紧上去排查,首先发现的是用户的正则不是最优正则,再发现cpp主程序用的re2使用FullMatch方法确实匹配不上。但奇怪的是,golang程序也页面都是可以的。

先解决问题,把告知用户后,把正则改回来了,然后开始排查问题,发现js、python、golang的行为是一致的,re2 cpp和java pattern的行为是一致的,但这两个阵营行为却是不一致的,有点吐血。

只好看代码,因为对java和golang更熟悉一些,所以看的是这两个的代码,发现了问题,java里在match时用了ENDANCHOR需要匹配所有输入的字符串,和re2的FullMatch一样,而golang的则是看能不能找到一个能匹配的结果,虽然方法名没写,但实际上是re2的PartialMatch。

golang监控程序的解决办法比较简单,把正则再包装一次,前面加上^(,后面加上)$,这样就也转变成了FullMatch了。页面上把正则小工具变成服务端校验而不是js校验,刚好re2有个java版的RE2/J,这样所有行为就一致了。