正则表达式没那么难
[] 表示一位字符
[a] 表示字母a
String regex = "[a]" System.out.println("a".matches(regex));//true System.out.println("aa".matches(regex));//false System.out.println("b".matches(regex)); //false
[abc] 表示包含abc中任意一位
String regex = "[a]" System.out.println("a".matches(regex));//true System.out.println("aa".matches(regex));//false System.out.println("b".matches(regex)); //true
^为取非
[^a] 表示非a的字母
String regex = "[^a]"; System.out.println("a".matches(regex));//false System.out.println("aa".matches(regex));//false, 两位了, System.out.println("b".matches(regex)); //true
-为区间连接符, 两头表示范围
a-z表示从a到z, 0-9 表示从0到9 A-Z表示A到Z
String regex = "[0-9]"; System.out.println("a".matches(regex));//false System.out.println("1".matches(regex));//true
. 表示任意字符
量词 ?, *, + {m,n}
? 附加到某一位后面表示当前位出现一次或者一次也没有, 次数<=1
String regex = "[0-9]?"; System.out.println("1".matches(regex));//true System.out.println("".matches(regex));//true System.out.println("a".matches(regex));//false, 注意这个不算没出现
*表示出现次数大于等于0 次数>=0
String regex = "[0-9]*"; System.out.println("1".matches(regex));//true System.out.println("123".matches(regex));//true System.out.println("".matches(regex));//true System.out.println("a".matches(regex));//false, 注意这个不算没出现
+表示出现次数大于等于1 次数>=1
String regex = "[0-9]+"; System.out.println("1".matches(regex));//true System.out.println("123".matches(regex));//true System.out.println("".matches(regex));//false System.out.println("a".matches(regex));//false, 注意这个不算没出现
{m, n}
String regex = "[0-9]{3,5}"; System.out.println("1".matches(regex));//false System.out.println("12".matches(regex));//false System.out.println("123".matches(regex));//true System.out.println("12345".matches(regex));//true System.out.println("123456".matches(regex));//false //注意空号中参数可以使用一个,{n}表示有且仅有n个 String regex = "[0-9]{3,5}"; System.out.println("12".matches(regex));//false System.out.println("123".matches(regex));//true System.out.println("12345".matches(regex));//false //{n,}表示大于等于n String regex = "[0-9]{3}"; System.out.println("12".matches(regex));//false System.out.println("123".matches(regex));//true System.out.println("12345".matches(regex));//true
常用字符标识
\d 表示0-9之间的数组相当于[0-9], \D表示非数字
String regex = "\\d"; //第一个\为转义字符 System.out.println("1".matches(regex));//true System.out.println("a".matches(regex));//false String regex = "\\D"; //第一个\为转义字符 System.out.println("1".matches(regex));//false System.out.println("a".matches(regex));//true
\s 表示空白字符相当于 [ \t\n\x0B\f\r], 可以理解为看不到的都算是空白字符 \S相当于对\s取反
String regex = "\\s"; //第一个\为转义字符 //空格 System.out.println(" ".matches(regex));//true //回车 System.out.println("\r".matches(regex));//true //换行 System.out.println("\n".matches(regex));//true //无字符 System.out.println("".matches(regex));//false System.out.println("a".matches(regex));//false
\w表示单词字符, 所有大小写字母,数字和下划线相当于[a-zA-Z_0-9], \W相当于\w取反
String regex = "\\w"; //第一个\为转义字符 //空格 System.out.println(" ".matches(regex));//false //回车 System.out.println("\r".matches(regex));//false System.out.println("a".matches(regex));//true System.out.println("1".matches(regex));//true System.out.println("_".matches(regex));//true System.out.println("#".matches(regex));//false
分组, 正则表达式中用()表示小组, 可以通过计算开括号来编号, 分好的组可以通过编号替代,第0组代表整个表达式,先看代码吧
String regex = "(h((a)(b)))\\1\\2\\3\\4"; System.out.println("habhababab".matches(regex));//true
解释上面的规则:
首先表达式前面(h((a)(b)))表示 一个h, 一个a,一个b如果没有后面的数组部分怎 匹配记过就是 hab, 后面的数组\\n表示组数, 组数的规律是从左往右找开括号, 按照分组规律可以将表达式分为下面四组
- 第一组 (h((a)(b))) 从第一个开括号开始到对应的闭括号结束
- 第二组 ((a)(b)) 从第二个开括号开始, 到第二个闭括号结束
- 第三组 (a)
- 第四组 (b)
所以对应的结果habhababab应该是 hab hab(第一组) ab(第二组) a(第三组)b(第四组)
至此, 正则的基本语法基本完毕, 下面来两个小练习,
用户名要求6-16位数字字母或下划线
"\w{6,16}"
匹配出叠词
"(.)\\1(.)\\2
匹配指定位数qq号码
//6-9位数的qq号码 "\d{6,9}"
好了今天的学习总结就到这里, 感兴趣的朋友可以参看这里 菜鸟教程 虽然有点像w3c但是感觉这个网站提供的小工具还是挺好用的, 鉴于笔者学疏才浅如有错误请在评论区指出, 以便互相促进技术的提升!!!