正则表达式

1.密码必须由6到20位字母和数字组成

//写法一
^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]{6,20})$ 
//写法二
^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$
解释:
^ 匹配一行的开头位置
(?![0-9]+$) 该位置后面不全是数字
(?![a-zA-Z]+$) 该位置后面不全是字母
[0-9A-Za-z] {6,20}6-20位数字或这字母组成

2.在防止xss攻击时,对html标签替换

1.初始
/<script\s*>.*<\/script\s*>/gi.test("<Script></script>")
2.优化
使用(?:pattern) 来解决方括号不适用的场景。
/<script\s*>(?:.|\s)*<\/script\s*>/gi.test("<Script>dd\n\n\rdddd</script>")
记住()中的|是必须要有的,不要写成下面的样子:
/<script\s*>(?:.\s)*<\/script\s*>/gi.test("<Script>dd\n\n\rdddd</script>")
3.为什么不使用[]*的方式来表示所有空白非空白字符?根据以下的结果可以看到,[]中的.只会匹配字符.而不是匹配任意字符。
/<script\s*>([.\s]*)<\/script\s*>/gi.test("<Script>ttt</script>")
false
/<script\s*>([.\s]*)<\/script\s*>/gi.test("<Script>\r\r\n</script>")
true
/<script\s*>([.\s]*)<\/script\s*>/gi.test("<Script>\r\r\nt</script>")
false
/<script\s*>([.\s]*)<\/script\s*>/gi.test("<Script>\r.\r\n.</script>")
true
4.最终优化 还是使用了\s\S这种互补的形式
/<script\s*>[\s\S]*<\/script\s*>/gi.test("<Script>\n layer.alert(\"JJJJJJJJJJJJJJJJJJJ\")\n</script>")
true
5.写匹配同级别的html标签还是不知道怎么写。按照下面方式写的还是一口气匹配了<script></script><Script></Script>。
   s = "<span><script></script>\n" +
        "<Script >" +
        "layer.alert(\"JJJJJJJJJJJJJJJJJJJ\")<" +
        "/Script></span>"
    if(s == null || s === undefined) return s;
    const regex1 = /<script\s*>[\s\S]*(<\/script\s*>)+?/gi
    let array1;
    while ((array1 = regex1.exec(s)) !== null) {
        console.log(`Found ${array1[0]}. Next starts at ${regex1.lastIndex}.`);
    }
    return s;

方式1
方式2
方式2

方式3
方式4
测试5

3.对于序号的提取

        // 匹配 1 、[1]、(1)、(1)中的一种,只提取数字  ?<= ?= 都表示其后的字符匹配,但是结果不需要 ;但是 ?<= 用在匹配开始的地方,?=用在匹配结束的地方
        String regex1 = "(^\\d+|(?<=^\\[)[0-9]+(?=].+)|(?<=^\\()[0-9]+(?=\\).+)|(?<=^()[0-9]+(?=).+))+";
        String curPara1 = curPara.toString();

        Pattern compile = Pattern.compile(regex1);
        Matcher matcher1 = compile.matcher(curPara1);
        if (matcher1.find()) {
            String group1 = matcher1.group();
            Matcher matcher2 = compile.matcher(text);
            if (matcher2.find()) {
                String group2 = matcher2.group();
                if (Integer.parseInt(group1) + 1 == Integer.parseInt(group2))
                    return true;
            }
        }

贪婪和非贪婪:加入?表示非贪婪,找到一个符合的立马返回;贪婪模式:匹配最长的那个

// 字符串 : <w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="851" w:footer="992" w:gutter="0"/>
          String wRegex = "(?<=w:" + w + "=\")(.*?)(?=\")";
          Matcher wmatcher = Pattern.compile(wRegex).matcher(group);
          if (wmatcher.find()) {
               String wgroup = wmatcher.group();
               System.out.println(w + "间距: " + wgroup);
          }

4.忽略大小写

正则为:"((?i)(key\\s{0,1}words))(?=[\\s|\\S]*)" ,匹配kerwords任意大小写,或者key words任意大小写
Pattern compile = Pattern.compile(splitHeader);
Matcher matcher = compile.matcher(text);
if(matcher.find()){
     splitString = text.substring(matcher.end());
}

5.判断字符是全角字符还是半角字符

if(s.matches("[\\uFF00-\\uFFFF]")){ // 全角字符
      return "用全角"+ s;
}else{
      return "用半角" + s;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值