有(wu)趣(yu)的正则学习经历
接到任务一个,给注册密码添加前端校验,要求如下: 密码长度介于8到16个字符之间,且必须包含大小写字母、数字和符号,不能有空格。分析如下:长度6-16 && 包含大字母+ && 包含小写字母+ && 包含数字+ && 符号+前端校验使用的是ValidateForm插件,自需要自定义一种校验类型就好了,开始学习正则. http://deerchao.net/tutorials/regex/regex.htm 只需要校验输入的字符串每个字符都在要求的字符条件范围内就好了. 那么问题来了. 对于限定的范围外,是不可控的.不能用 ^.*[A-Z]+.*$来判断输入字符串中包含自少一个大写字符,而且正则里是没有 "与" 这种关系的,只要满足"|"前的一个正则就会返回true. 所有字符串都必须在掌控之内. 排列组合出所有要求的数据类型的组合! A: 大写字母 [A-Z] B:小写字符 [a-z] C:数字 d D:要求符号 [~!@#$%^&*()<>?{}+*/|-] 根据初中数学得知组合共有为4!=24种 笔算组合太low,用代码生成. package test; import org.junit.Test; import java.util.List; public class test { @Test public void test() { // A : [A-Z] //B:[a-z] //C:d //D:[~!@#$%^&*()<>?{}+*/|-] String[] a = {"[A-Z]","[a-z]","d","[~!@#$%^&*()<>?{}+*/|-]"}; for (int i = 0; i < 4; i++) { String[] b = new String[4]; b[0] = a[i]; for (int j = 0; j < 4; j++) { if (j != i) { b[1] = a[j]; for (int k = 0; k < 4; k++) { if (k != j && k != i) { b[2] = a[k]; for (int l = 0; l < 4; l++) { if (l != k && l != j && l != i) { b[3] = a[l]; System.out.print(b[0]+"+"+b[1]+"*"+b[2]+"*"+b[3]+"*"+"|"); break; } } } } } } } } } 时间复杂度最高的O(n!),有空再改进,效率是低了点,正则出来了. [A-Z]+[a-z]*d*[~!@#$%^&*()<>?{}+*/|-]*|[A-Z]+[a-z]*[~!@#$%^&*()<>?{}+*/|-]*d*|[A-Z]+d*[a-z]*[~!@#$%^&*()<>?{}+*/|-]*|[A-Z]+d*[~!@#$%^&*()<>?{}+*/|-]*[a-z]*|[A-Z]+[~!@#$%^&*()<>?{}+*/|-]*[a-z]*d*|[A-Z]+[~!@#$%^&*()<>?{}+*/|-]*d*[a-z]*|[a-z]+[A-Z]*d*[~!@#$%^&*()<>?{}+*/|-]*|[a-z]+[A-Z]*[~!@#$%^&*()<>?{}+*/|-]*d*|[a-z]+d*[A-Z]*[~!@#$%^&*()<>?{}+*/|-]*|[a-z]+d*[~!@#$%^&*()<>?{}+*/|-]*[A-Z]*|[a-z]+[~!@#$%^&*()<>?{}+*/|-]*[A-Z]*d*|[a-z]+[~!@#$%^&*()<>?{}+*/|-]*d*[A-Z]*|d+[A-Z]*[a-z]*[~!@#$%^&*()<>?{}+*/|-]*|d+[A-Z]*[~!@#$%^&*()<>?{}+*/|-]*[a-z]*|d+[a-z]*[A-Z]*[~!@#$%^&*()<>?{}+*/|-]*|d+[a-z]*[~!@#$%^&*()<>?{}+*/|-]*[A-Z]*|d+[~!@#$%^&*()<>?{}+*/|-]*[A-Z]*[a-z]*|d+[~!@#$%^&*()<>?{}+*/|-]*[a-z]*[A-Z]*|[~!@#$%^&*()<>?{}+*/|-]+[A-Z]*[a-z]*d*|[~!@#$%^&*()<>?{}+*/|-]+[A-Z]*d*[a-z]*|[~!@#$%^&*()<>?{}+*/|-]+[a-z]*[A-Z]*d*|[~!@#$%^&*()<>?{}+*/|-]+[a-z]*d*[A-Z]*|[~!@#$%^&*()<>?{}+*/|-]+d*[A-Z]*[a-z]*|[~!@#$%^&*()<>?{}+*/|-]+d*[a-z]*[A-Z]* 正则果然是外星人看的东西. 是不是感觉碉堡了,包含了所有要求数据类型的排列组合方式. 得意洋洋正要拷过去用的时候. 突然想到一开始怎么想来着,只要每个字符都包含在要求范围之内就好了,为什么需要把所有排列和组合"|"起来? 这么写不久行了 /^([0-9]|[a-z]|[A-z]|[~!@#$%^&*()<>?{}+*/|-]){6,18}$/ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |