正则表达式是对字符串的操作。
1.匹配器
(1).字符:
\r:回车
\n:换行
\f:换页符
(2).字符类
[abc]:abc字符
[a-zA-Z]:a-z并集A-Z
[^abc]:除了abc的其他字符
[a-z&&[def]]:def(交集)
(3).预定义字符类
\w:单词字符 \W:非单词字符
\s:空白字符 \S:非空白字符
\d:数字[0-9] \D:非数字
.:匹配所有字符
(4).边界匹配器
\A:输入开始 \Z:输入最后
^:行的开头 $:行的结尾
$1:第一个括号里的内容 \b:单词边界
(5).数量匹配
+:一次或多次
*:0次或多次
?:0次或一次
{m}:m次
{m,}:至少m次
{m,n}:m至n次
2.正则用途:匹配,切割,替换,获取
(1).匹配:str.matches(regex)
(2).切割:str.split(regex);
(3).替换:str.replaceAll(regex,new Str);
(4).获取:Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
while(m.find()){m.group();}
3.正则基本功能实例:
(1).匹配电话号码
String regex = "1[358]\\d{9}";
boolean b = tel.matches(regex);
(2).切割字符串
String str = "zhangsan%%lisi%%wangwu";
String regex = "(.)\\1+";//任意字符重复2次及以上
String[] strs = str.split(regex);
(3).替换字符串
String str = "zhangsan%%lisi%%wangwu";
str = str.replaceAll("(.)\\1+","&");
(4).获取长度为3的单词
String str = "da jia zhu yi le ";
String regex = "\\b[a-zA-Z]{3}\\b";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
while(m.find()){
System.out.println(m.start()+m.group()+m.end());
}
4.综合案例
(1).将 “我......我.....要....学....学...编......程.......程” 变得不结巴
String str = “我......我.....要....学....学...编......程.......程” ;
str = str.replaceAll("(.)\\1+","");
str = str.replaceAll("(.)\\1+","$1");
(2).对IP地址进行排序
String ips = "192.168.1.45 192.168.45.78 192.113.4.1 5.1.4.7 41.54.111.4";
ips = ips.replaceAll("(\\d+)","00$1");
ips = ips.replaceAll("0*(\\d{3})","$1");
String[] ipStr = ips.split(" +");
sort(ipStr);
for(String ip:ipStr){
System.out.println(ip.replaceAll("0*(\\d+)","$1"));
}
(3).将网页上的邮箱全都保存下来 (贴子里那种邮箱发种子的可能就是在收集你们的邮箱哦,注意了!)
public static void main(String[] args){
File file = new File("1.html");
BufferedReader br = new BufferedReader(new FileReader(file));
String regex = "\\w+@\\w+(\\.\\w)+";
Pattern p = Pattern.compile(regex);
ArrayList<String> list = new ArrayList<String>();
String line = null;
while((line = br.readline())!=null){
Matcher m = p.matcher(line);
while(m.find()){
list.add(m.group());
}
}
for(String email:list){
System.out.println(email);
}
}