今天在项目中遇到一个情况,正则表达式java后端和javascript前端的写法是一致的,但是并没有验证通过,原因还没有找到,代码如下:
public class PatternTest { private final static String TN_NAME_SUFFIX_REGEX = "[a-zA-Z0-9]+$"; private final static Pattern TN_NAME_SUFFIX_PATTERN = Pattern.compile(TN_NAME_SUFFIX_REGEX); @Test public void testPattern(){ Assert.assertTrue(!TN_NAME_SUFFIX_PATTERN.matcher("aaB%").matches()); Assert.assertTrue(!TN_NAME_SUFFIX_PATTERN.matcher("aaB_").matches()); Assert.assertTrue(TN_NAME_SUFFIX_PATTERN.matcher("aaB0").matches()); } }
这样写是没有问题,但是在qa在测试的时候发现前端没有拦截住,后端拦截住了,前端的代码如下:
var v = $.trim(formMap.tnNameSuffix); var pattern = /[0-9a-zA-Z]+$/g; if (!v || v.length == 0) { return "[自定义标识]请填写自定义标识!"; } else if (v.length > 16) { return "[自定义标识]过长,最多填写16位!"; } else if(!pattern.test(v)){ return "[自定义标识]不合法,只能为[0-9a-zA-Z],请检查!"; }
测试的结果是只要不是以特殊字符结尾都可以通过,最后修改了正则表达式就通过,修改的正则表达式如下:
var v = $.trim(formMap.tnNameSuffix); var pattern = /^[0-9a-zA-Z]+$/g; if (!v || v.length == 0) { return "[自定义标识]请填写自定义标识!"; } else if (v.length > 16) { return "[自定义标识]过长,最多填写16位!"; } else if(!pattern.test(v)){ return "[自定义标识]不合法,只能为[0-9a-zA-Z],请检查!"; }
具体原因还不清楚,如果有人熟悉的话可以帮忙分析一下,为什么js里面要这么写?