正则表达式
-------android培训、java培训、期待与您交流!----------
正则表达式regex: 是符合一定规则的表达式。(操作对象类: java.util.regex包)
作用:专门用于操作字符串;
特点:通过特定的符号来表示一些代码操作,达到简化书写目的;
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性越差。
应用: 可通过正则表达式实现字符串的匹配、切割、替换、获取等功能。
一、匹配 : String
//对指定字符串进行匹配,如有一处不符,结束返回false;
1、校验QQ号:
2、校验手机号:
3、校验邮箱:
代码示例:
String qq = "661136";
String regex = "[1-9][0-9]{4,15}";
//即指定数值要求首位只能是1-9,后面4-15位是0-9数字;
boolean flag = qq.matches(regex);
代码示例:
public static void main(String[] args){
getQQ("5555j222isaic2132131iasis99921acias08121991bcuauau2111ew",true);
}
//1、提取符合QQ号格式的字符串,并选择是否返回子串的角标位置;
public static void getQQ(String qq,boolean flag)
{
String regex = "[1-9][0-9]{4,15}";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(qq);
while(m.find())
{
System.out.println("符合QQ格式的有: "+m.group());
if(flag)
System.out.println("它的角标位在 "+m.start()+"——"+m.end());
}
}
二、切割: String
1、正则表达式" +":按照多个空格进行切割;
2、正则表达式"\\.":按点进行切割;
3、正则表达式"\\\\":按照\\进行切割(因为\是转义字符);
4、正则表达式"(.)\\1+"按叠词进行切割:为了可以让规则的结果被重用,可以将规则封装成一个组,用()完成,组的出现都有编号,从1开始,想要使用已有的组可以通过\n(n就是组的编号)的形式来获取。
PS:"."在Java中代表任意字符,因此要切割点必须要添加"\\"来转义。
三、替换: String
【如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组】
1、将数字替换成#:
2、将连续五个以上的数字替换成#:replaceAll(str,"\\d{5,}","#'')
3、将叠词替换成单个单词:replace(str,"(.)\\1+","$1")
四、获取:
Patten :正则表达式的编译表示形式;
Matcher :匹配器;
操作步骤:
1、将正则表达式封装成对象
2、让正则对象和要操作的字符串相关联
3、关联后,获取正则匹配引擎
4、通过引擎对符合规则的子串进行操作,比如取出。
Java.util.regex包类方法:
创建对象方法:
Pattern p = Pattern.compile(Stringregex);
Matcher m = p.matcher(String str);
Matcher类方法:
【//匹配器依靠角标指针索引,所以要注意上下代码对同一匹配器的影响;】
boolean
String
【注:(重点)因为同一个匹配器中方法使用同一个索引,当一个方法使用移动了索引位后,如果没有重置匹配器,那么就是从移动后当前的索引位开始查找。】
五、其他:
1、将删除字符串中的"."和将重复字符变成单个(去除重复),
例: "我我..我....我要...要要...学学学学...学编编...编...程程";
public static void main(String[] args){
MatcherTool.Remove( "我我..我....我要...要要...学学学学...学编编...编...程程");
}
// 5、去除重复: 去除字符串中的".",以及将重复出现的字符,变成单个;
public static void Remove(String str)
{
str = str.replaceAll("[.]",""); //将字符串中的"."去除为""(空);
str = str.replaceAll("(.)\\1+","$1");
//() 代表将数据封装成一个组(由左向右,按左括号排组号);
//解析: "\\1"重复第一组的数据; (即(.)判断"我"时,"\\1"要求后续出现是相同的字符)
//"$1"表示: 获取当前第一组的数据 (当需要替换时,(.) = "$1");
System.out.println("提取转换后的字符串为: "+str);
}
2 、给IP地址进行排序:
public static void main(String[] args) {
//6、给IP地址排序: "192.168.1.1 8.8.8.8 10.10.10.10 255.255.255.0"等
sortIP("192.168.1.1 8.8.8.8 10.10.10.10 255.255.255.0");
}
public static void sortIP(String IPstr)
{
//1、为使不同数值的IP地址具备比较性,需将其统一填充到均为3位数,故在数值前面添加两个"00";
IPstr = IPstr.replaceAll("(\\d+)","00$1");
System.out.println(IPstr);
//2、将填充后超过3位数的IP地址字段删除多余的"0";
IPstr = IPstr.replaceAll("0*(\\d{3})","$1");
System.out.println(IPstr);
String[] str = IPstr.split(" "); //根据" "(空格)分割字符串并存储到字符串数组中;
Arrays.sort(str); //调用Arrays工具类方法对数组进行排序;
for(String s : str) //遍历IP地址数组中元素;
{ //删除字符串(IP地址字段)中的填充的无意义的"0",并打印该IP地址值;
System.out.println(s.replaceAll("0*(\\d+)","$1"));
}
}
}
六、总结
1、如果只想要知道该字符是否是对错,使用匹配;
2、想要将以后的字符串变成另一个字符串,替换;
3、想要按照自定的方式将字符串变成多个字符串,使用切割(即获取规则以外的字符串);
4、想要拿到符合需求的字符子串,获取(即获取符合规则的子串)。
各功能实现代码详见: