有(wu)趣(yu)的正则学习经历

前端之家收集整理的这篇文章主要介绍了有(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}$/

猜你在找的正则表达式相关文章