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;
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;
}