正则表达式用于操作字符串数据。
1、匹配:
匹配手机号码
String tel = "15022443344";
String regex = "1[3578][0-9]{9}";
String regex2 = "1[3578]\\d{9}";
boolean r = tel.matches(regex);
sosy(tel+":"+r);
1[3578][0-9]{9}
1[3578]\\d{9}
1:第一位固定是1
[3578]:第二位是3578中的一个
[0-9]:第三位是0-9中的一个
{9}:第三位共出现9次
\:对\进行转义
\d:代表[0-9]
2、切割:
其实使用的就是String类中的split(String regex)方法
*:任意次数,0次,1次或多次
?:0次或1次
+:1次或多次
String str = "adf djs sfjjs";
String names = str.split(" +");//空格出现一次或多次
===========================
.:代表任意字符
String str = "adf.djss.fjjs";
String names = str.split("\\.");
():代表组
//根据重复的t和重复的m切割三个字段
String str = "zhangsantttttttxiaoqiangmmmmmmmmzhaoliu";
String names = str.split("(.)\\1+");
(.)\\1+
.:代表第一个字符是任意字符,可以是t,也可以是m
(.):默认代表的是第1组
\\1:代表第二个字符是第1组的重复
+:代表重复的组出现1次或多次
组:((A)(B(C)))
最外边的()代表第1组
(A)是第2组
(B(C))是第3组
(C)是第4组
3、替换:
replaceAll(regex,replacement)
//用#代替所有的连续的重复字符
String str = "zhangsantttttttxiaoqiangmmmmmmmmzhaoliu";
str = str.replaceAll("(.)\\1+", "#");
syso(str);
输出结果:
zhangsan#xiaoqiang#zhaoliu
========================
//将所有连续的重复字符变成单个,重复的t变成1个t,重复的m变成一个m
String str = "zhangsantttttttxiaoqiangmmmmmmmmzhaoliu";
str = str.replaceAll("(.)\\1+", "$1");
syso(str);
输出结果:
zhangsantxiaoqiangmzhaoliu
$1:代表获取前一个参数中的组1
============================
String tel = "15022229999";
tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2");
syso(tel);
输出结果:
150****9999
4、获取
//取三个字符组成的字符串
public class RegexGetDemo {
public static void main(String[] args) {
String str = "hao jlalal jie lskqjx wxm jajlw";
String regex = "\\b[a-z]{3}\\b";
//将正则封装成对象
Pattern p = Pattern.compile(regex);
//获取匹配器对象
Matcher m = p.matcher(str);
//查找
while(m.find()) {
System.out.println(m.group());
}
}
}
输出结果:
hao
jie
wxm
\b:表示边界
5、练习
String str = "我我...我我我....我我我要...要要要.....学学学....编编....程程程";
//去掉.
str = str.replaceAll("\\.+", "");
//去掉叠词
str = str.replaceAll("(.)\\1+","$1");
System.out.println(str);
输出结果:
我要学编程
//ip地址排序
String ip_str = "192.168.9.30 127.0.0.1 4.4.4.5 101.80.8.44";
System.out.println("str:"+ip_str);
//补0,ip地址四段数字,不足3位的补足3位
ip_str = ip_str.replaceAll("(\\d+)", "00$1");
//四段数字全都保留32位
ip_str = ip_str.replaceAll("0*(\\d{3})", "$1");
//分割
String[] ips = ip_str.split(" +");
//treeSet排序
TreeSet<String> ts = new TreeSet<String>();
for(String ip:ips) {
ts.add(ip);
}
//去掉补足3位的0
System.out.println("排序");
for(String ip:ts) {
System.out.println(ip.replaceAll("0*(\\d+)","$1"));
}
//校验邮箱地址
String mail = "test@126.com";//.cn .com.cn
String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]{1,3})+";
boolean b = mail.matches(regex);
System.out.println(b);
网页爬虫,获取指定网页里所有的邮箱
public static List<String> getMails() throws IOException {
//源
URL url = new URL("http://www.baidu.com/web/aaa.html");
//读取源
BufferedReader bufIn = new BufferedReader(new InputStreamReader(url.openStream()));
//对源中的数据进行规则匹配
String mail_regex = "\\w+@\\w+(\\.\\w)+";
List<String> list = new ArrayList<String>();
Pattern p = Pattern.compile(mail_regex);
String line = null;
while((line = bufIn.readLine()) != null) {
Matcher m = p.matcher(line);
while(m.find()) {
//数据写入集合
list.add(m.group());
}
}
bufIn.close();
return list;
}