日期:2014-05-16  浏览次数:20493 次

java和javascript的正则表达式有点不同

    今天在项目中遇到一个情况,正则表达式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里面要这么写?