正则表达式
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
- 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”)
- 可以通过正则表达式,从字符串中获取我们想要的特定部分
一、正则表达式常见规则
字符
| X | 字符x |
| —- | —– |
| \ \ | 反斜线字符 |
| \t | 制表 |
| \n | 换行 |
| \r | 回车 |
| \f | 换页 |字符类
| [abc] | a、b或c |
| ————– | ——— |
| [a-zA-Z] | a到z或A到Z |
| [a-z&&[def]] | d、e或f(交集) |
| [^abc] | 非a、b、c |
| [a-d[m-p]] | a到d或m到p |
| [a-z&&[ ^bc]] | a到z除b、c |
| [a-z&&[ ^m-p]] | a-z除m到p |预定义字符类
| . | 任何字符 |
| —- | —————— |
| \d | 数字[0-9] |
| \D | 非数字 |
| \s | 空白字符[\t\n\f\r\xOB] |
| \S | 非空白字符 |
| \w | 单词字符[a-zA-Z_0-9] |
| \W | 非单词字符 |边界匹配器
| ^ | 行的开头 |
| —- | ——– |
| $ | 行的结尾 |
| \b | 单词边界 |
| \B | 非单词边界 |
| \A | 输入的开头 |
| \G | 上一个匹配的结尾 |
| \z | 输入的结尾 |
| \Z | 输出的结尾 |Greedy数量词
| x? | 至多一次 |
| —— | —- |
| x* | 零或多次 |
| x+ | 至少一次 |
| x{n} | 恰好n次 |
| x{n,} | 至少n次 |
| x{n,m} | n到m次 |正则表达式组概念
| () | 表示组,组后面\数组表示组编号,组零表示整个表达式 |
| —- | ————————- |
| {} | 表示重复操作 |
| [] | 用于定义字符集 |
二、正则表达式匹配
其使用的就是String类中的matches方法。例:
1 | String regex = "1[358][0-9]{9}";//匹配电话号码 |
三、正则表达式切割
其使用的就是String类中的split方法。例:
1 | String str = "atttbmmc";//切割字符串 |
四、正则表达式替换
其使用的就是String类中的replaceAll方法。例:
1 | String str = "zhangsantttlisimmm"; |
五、正则表达式获取
类Pattern,java.util.regex包。
将正则规则进行对象的封装
1
Pattern p = Pattern.compile("a*b");
通过正则对象的matches方法和字符串相关联,获取要对字符串操作的匹配器对象Matcher
1
Matcher m = p.matcher("aaaaab");
通过Matcher匹配器对象的方法对字符串进行操作
1
boolean b = m.matches();
例:
1 | String str = "da jia hao,ming tian bu fang jia";//获取三个字母的单词 |
六、正则表达式练习
字符串替换
1
2
3
4
5String str = "我我...我..要要要...学学学...编程程";
//1.将字符串.去掉
str = str.replaceAll("\\.+","");
//2.替换叠词
str = str.replaceAll("(.)\\1+","$1");对ip地址排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18String ip_str = "192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55";
//1.将ip地址切出
String[] ips = ip_str.split(" +");//空格
//2.为了让ip可以按照字符串顺序比较(TreeSet自带),只要让ip的每一段位数相同,补零
ip_str = ip_str.replaceAll("(\\d+)","00$1");
//3.然后每一段保留位数3位
ip_str = ip_str = .replaceAll("0*(\\d{3})","$1");
//4.再将ip地址切出
String[] ips = ip_str.split(" +");//空格
//5.排序
TreeSet<String> ts = new TreeSet<String>();
for(String ip :ips){
ts.add(ip);
}
//ip地址复原
for(String ip :ts){
syso(ip.replaceAll("0*(\\d+)","$1"));
}对邮箱校验
1
2
3
4
5
6String mail = "abc1@sina.com";
String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]{1,3})+";
regex = "\\W+@\\w+(\\.\\w+)+";//1@1.1,笼统校验
//mail.indexof("@") != -1;
boolean b = mail.matches(regex);
syso(mail+":"+b);爬虫练习
网页爬虫:其实就是一个程序用于在互联网中获取符合指定规则的数据。例:爬邮箱地址,本地
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24public static List<String> getMails() throws IOException{
//1.读取源文件
BufferedReader bufr = new BufferedReader(new FileReader("c:\\mail.html"));
//2.对读取的数据进行规则的匹配,从中获取符合规则数据
String mail_regex = "\\W+@\\w+(\\.\\w+)+";
Pattern p = Pattern.compile(mail_regex);
String line = null;
List<String> list = new ArrayList<String>();
while((line = bufr.readLine()) != null){//读每行数据
Matcher m = p.matcher(line);//读一行匹配一行
//3.获取到加到集合
while(m.find()){//匹配器
list.add(m.group());
}
}
return list;
}
public static void main(String[] args)throws IOException{
List<String> list = getMails();
for(String mail : list){
syso(mail);
}
}爬网络的话,改变源文件
1
2URL url = new URL("http://baidu.com");
BufferedReader bufr = new BufferedReader(new InputStreamReader(url.openStream()));