正则表达式:符合一定规则的表达式
作用:用于专门操作字符串的表达式
好处:可以简化对字符串的复杂操作
弊端:符号定义越多,正则越长,阅读性差
特点:用特定的符号来代表一些代码操作,这样就简化了代码书写
学习正则表达式就是学习符号的应用方法
一、匹配 String matches方法
public boolean matches(String regex)
//不能以0开头、必须都是数字,位数5-15
String str="1989m";
String regex="[1-9]\\d{4,14}";
boolean b=str.matches(regex);
System.out.println(b);//false
//手机号码:13 15 18(只能包含数字且11位)
String str="1333296245a";
String regex="[1][3,5,8]\\d{9}";//若“\”出现,则“\\”
boolean b=str.matches(regex);
System.out.println(b);
二、切割
public String[] split(String regex)
public String[] split(String regex, int limit)
String str="zhangsan lisi wangwu";
String regex=" +";//规则是按照空格出现一次或者多次切割
String[] arr=str.split(regex);
for(String s:arr)
{
System.out.println(s);
}
String str="zhangsan.lisi.wangwu";
String regex="\\.";//用.切割,因为"."在正则中有含义:代表任意字符,所以要对"."转义为"\."
//在字符串中\又具有转义的作用,所以要再加个"\",这样正则中“\.”就是普通的“.”
String[] arr=str.split(regex);
for(String s:arr)
{
System.out.println(s);
}
String str="c:\\abc\\a.txt";
String regex= "\\\\";//根据\\切割,切一个"\",要用"\\"
String[] arr=str.split(regex);
for(String s:arr)
{
System.out.println(s);
}
String str="ahhhcidbvkkoccc";
String regex= "(.)\\1+";
//按照叠词切割,为了可以让规则的结果被重用,可以将规则封装成一个组,
//用()完成,组的出现都有编号,从1开始,想要使用已有的组可以通过\n(n就是组的编号)
//的形式来获取
String[] arr=str.split(regex);
for(String s:arr)
{
System.out.println(s);
}
三、替换
public String replaceAll(String regex, String replacement)
String str="wer8934605juowa89320571f";
String regex= "\\d{5,}";//将连续5个以上数字替换成#
String str1=str.replaceAll(regex, "#");
System.out.println(str1);
String str="cudddbhuuujddd";
String regex= "(.)\\1+";//将多个重复字母替换成&
String str1=str.replaceAll(regex, "&");
System.out.println(str1);
String str="cudddbhuuujddd";
String regex= "(.)\\1+";//将多个重复字母替换成一个字母
String str1=str.replaceAll(regex, "$1");//$1就是获取叠词的第一个字母
System.out.println(str1);
四、获取
操作步骤:
1,将正则表达式(规则)封装成对象
2,让正则对象和要操作的字符串相关联
3,关联后,获取正则匹配引擎
4,通过引擎对符合规则的自创进行操作,比如获取
String str="min tian jiu yao fang jia le ,da jia。";
String regex="\\b[a-z]{3}\\b";//"\b"是单词边界,获取长度为3的单词z子串
Pattern p=Pattern.compile(regex);//将给定的正则表达式编译到模式中
//将正则对象和要操作的字符串相关联,就获得了匹配引擎
Matcher m=p.matcher(str);
//通过匹配引擎对符合规则的子串进行操作,比如取出
/* boolean b=m.find();//将规则作用到字符串上,并进行符合规则的子串的查找
System.out.println(b);
String sub=m.group();
System.out.println(sub);
类似集合中的迭代器,下一个相匹配的是否存在,存在输出该子串
*/
while(m.find())
{
System.out.println(m.group());
System.out.println(m.start()+"....."+m.end());end是结束字符的下一个字符位置
}
//////////////////////////////////////////
System.out.println(m.matches());//将规则作用在整个字符串上,相当于规则就是3个字母的单词,
//因为字符串长度>3,所以返回false,并且指针指向后移,在下面的寻找子串的过程中,不会输出“min”
while(m.find())
{
System.out.println(m.group());
System.out.println(m.start()+"....."+m.end());end是结束字符的下一个字符位置
}
五、练习
需求一将“我我…我我…我要..要要…要要…学学学…学学…编编编..编程..程.程…程…程”——>”我要学编程”
到底用四种功能中的哪一个?或者哪几个?
1,如果只想知道该字符对错,用匹配
2,想要将已有的字符串变成里一个字符串,替换
3,想要按照自定的方式将字符串变成多个字符串,切割。(获取规则以外 的子串)
4,想要拿到符合需求的字符串子串,获取。(获取符合规则的子串)
StringBuilder sb=new StringBuilder();
String str="我我...我我...我要..要要...要要...学学学...学学...编编编..编程..程.程...程...程";
//首先可以根据多个.切割,再将其合并成字符串
String re="\\.+";
String [] arr=str.split(re);
for(String s:arr)
{
sb.append(s);
}
String str1=sb.toString();//我我我我我要要要要要学学学学学编编编编程程程程程
上面的切割也可以用替换的方法
/* //替换,现将.去掉
String re="\\.+";
String str1=str.replaceAll(re, "");
System.out.println(str1);
*/
//再按照叠词(.)\\1+,将重叠词去掉
String re1="(.)\\1+";
String str2=str1.replaceAll(re1, "$1");
System.out.println(str2);
需求二 : 192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30 将ip地址进行地址段顺序的排序
String ip="192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";
//由2.2.2.2,每段需要的0为2个,所以IP的每一段都补2个零,从而使得每段至少3个位
String re="(\\d+)";//取多个数字,因为要获得其值,所以要包装成组
ip=ip.replaceAll(re, "00$1");
System.out.println(ip);
//要进行比较大小的就是每段的后3位,在上面的加“0”过程中,例如192-->00192,所以要将多余的0去掉
//0*:0含有零个或者多个,(\\d{3})取最低三位,因为0*已将每段的0取走,要获取最低三位,所有用组
String re1="0*(\\d{3})";
ip=ip.replaceAll(re1, "$1");
System.out.println(ip);
//将这个ip地址按照空格切割成字符数组
String re2=" +";
String [] arr=ip.split(re2);
//下面进行排序,可以用Arrays.sort方法进行排序
Arrays.sort(arr);
//System.out.println(Arrays.toString(arr));
//因为当前就是每段3位,002,这种需要替换一下,所以要在遍历过程中进行替换
String re3="0*(\\d+)";
for(String s:arr)
{
System.out.println(s.replaceAll(re3, "$1"));
}
需求三:对邮件地址进行校验
String mail="SDGRGH@sina.com.cn";
String mail="SDGRGH@sina.com";
String reg="[a-zA-Z0-9_]{6,12}@[a-zA-Z0-9_]+(\\.[a-zA-Z]+){1,3}";//用户名是大小写字母
//数字和下划线都可以,[]只是一位判断
System.out.println(mail.matches(reg));