正则表达式
概述
就是由一些特定的字符组成,代表的是一个规则。
是String中的一个方法 matches
boolean boo = "a".matches("[abc]");
作用:1.用来校验数据格式是否合法(更简单、更便捷)。2.在一段文本中查找满足要求的内容。
书写规则
字符类(只匹配单个字符) | |
[abc] | 只能是a, b,或c |
[^abc] | 除了a, b, c之外的任何字符 |
[a-zA-Z] | a到z A到z,包括(范围) |
[a-d[m-p]] | a到d,或m到p |
[a-z&&[def]] | d, e,或f(交集) |
[a-z&&[^bc]] | a到z,除了b和c (等同于[ad-z]) |
[a- z&&[^m-p]] | a到z,除了m到p (等同于[a-1q-z]) |
预定义字符(只匹配单个字符) | |
. | 任何字符(回车符号不匹配) |
\d | 一个数字:[0-9] |
\D | 非数字:[^0-9] |
\s | 一个空白字符: |
\S | 非空白字符:[^\s] |
\w | [a-zA-Z_ 0-9] |
\W | [^\w]一个非单词字符 |
boolean boo = "1".matches("\\d")
// \d之前要加一个\
数量词 | |
X? | X,一次或0次 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X {n} | X,正好n次 |
X{n, } | X,至少n次 |
X {n,m} | X,至少n但不超过m次 |
boolean boo = "a".matches("\\w?");
符号 | 含义 | 举例 |
[ ] | 里面的内容出现一次 | [abc] |
^ | 取反 | [^abc] |
&& | 交集(不能写单个的&) | [a-z&&m-p] |
(?i) | 忽略大小写 | |
| | 或(写在方括号外面表示并集) | ab|AB |
( ) | 分组 | a(bc)+ |
\ | 转义字符 | \\d |
{ } | 具体次数 | a{7} \\d{7,19} |
"ABC".matches("(?i)abC");
// true
"aBc".matches("a((?i)b)c");
// true
"123".matches("\\d{3}I[a-z]{3}");
//要求要么是3个小写字母,要么是3个数字。
"我爱编程666".matches("我爱(编程)+(666)+");
//必须是"我爱"开头,中间可以是至少一个“编程”,最后至少是1个"666"
".".matches("\\.");
//判断是否为点
应用
查找文本中的内容
1.定义爬取规则(正则表达式)
2.把正则表达式封装成一个Pattern对象
3.通过pattern对象得到查找内容的匹配器
4. 定义一个循环,通过匹配器开始去内容中查找信息
5.取出信息
//文本
String date = "xxxxxxxxxxxxxxxxxxx"+
"XXXXXXXXXXXXXXXXXXXXXXX";
String regex = "(\\W{1, }|" +"(1[3-9]\\d{9})|(@\d{2,5}-?\\d{5,15})";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(data);
while(matcher.find()){
System.out.println(matcher.group());
}
搜索替换、分割内容
需要结合String提供的方法完成。
方法名 | 说明 |
public String replaceAll(String regex , String newStr) | 按照正则表达式匹配的内容进行替换 |
public String[ ] split(String regex): | 按照正则表达式匹配的内容进行分割字符串,反回一个字符串数组。 |
String s1 = "XXXXXXXXX";
s1.replaceAll("\\w+","z");
//(拓展):"我我我喜欢编编编编编编编编编编编编程程程!",需要优化成“我喜欢编程!”
string s2 ="我我我喜欢编编编编编编编编编编编编程程程";
system.out.println(s2.replaceAll("(.)\\1+" , "$1"));
/**
* (.)一组: .匹配任意字符的。
* \\1 :为这个组声明一个组号:1号
* + :声明必须是重复的字
*/
String s2 = "XXX000X0X00XXX";
String[] s3= s2.split("\\d+");
System.out.println(Arrays.toString(s3));