黑马程序员-Java基础总结14——正则表达式

正则表达式

-------android培训java培训、期待与您交流!---------- 

正则表达式regex:  是符合一定规则的表达式。(操作对象类: java.util.regex包)

作用:专门用于操作字符串 

特点:通过特定的符号来表示一些代码操作,达到简化书写目的;

好处:可以简化对字符串的复杂操作 【实际也是学习特殊符号的使用】

弊端:符号定义越多,正则越长,阅读性越差

应用: 可通过正则表达式实现字符串的匹配、切割、替换、获取等功能。

       网页爬虫(蜘蛛)——索引搜索网页或文件中所需的资料: 邮件、QQQQ群等。

 

一、匹配 : String  matches(Stringregex);

//对指定字符串进行匹配,如有一处不符,结束返回false

1、校验QQ:  [1-9][0-9]{4,15}

2、校验手机号:  1[359]\\d{9}

3、校验邮箱:   

   A、精确   :     "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+"

   B、相对不精确:     "\\w+@\\w*(\\.\\w+){1,3}"

   C、超级简单  (String)     mail.indexOf("@")!=-1;

代码示例:  【校验QQ: [1-9][0-9]{4,15}

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  split(Stringregex); //将以符合匹配的数据作为切割界线;

1、正则表达式" +":按照多个空格进行切割;

2、正则表达式"\\.":按点进行切割;

3、正则表达式"\\\\":按照\\进行切割(因为\是转义字符)

4、正则表达式"(.)\\1+"按叠词进行切割:为了可以让规则的结果被重用,可以将规则封装成一个组,用()完成,组的出现都有编号,从1开始,想要使用已有的组可以通过\n(n就是组的编号)的形式来获取。

PS:"."在Java中代表任意字符,因此要切割点必须要添加"\\"来转义。

 

三、替换: String replaceAll(regex,str); //用指定数据替换符合的数据;

【如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组】

1、将数字替换成# str.replaceAll(str,"\\d","#")

2、将连续五个以上的数字替换成#replaceAll(str,"\\d{5,}","#'')

3、将叠词替换成单个单词:replace(str,"(.)\\1+","$1") 其中$代表获取组中的元素。

 

四、获取:  java.util.regex包的)PattenMatcher

Patten :正则表达式的编译表示形式;

Matcher :匹配器;

操作步骤:

1、将正则表达式封装成对象

2、让正则对象和要操作的字符串相关联

3、关联后,获取正则匹配引擎

4、通过引擎对符合规则的子串进行操作,比如取出。

 

Java.util.regex包类方法:

创建对象方法:

Pattern p = Pattern.compile(Stringregex); //将给定的正则表达式编译到模式中;

Matcher m = p.matcher(String str);   //创建匹配给定输入与此模式的匹配器;

 

Matcher类方法:      (三种不同查找)

//匹配器依靠角标指针索引,所以要注意上下代码对同一匹配器的影响;】

   .matches() :尝试将整个区域与模式匹配(是将整个数据区域进行匹配)

   .lookingAt()  :尝试将输入序列从头开始与该模式匹配。

boolean  .find() :将指定规则作用到字符串上,查找符合规则的子串;

String   .group() :用于获取匹配操作后的结果;

   .start() :返回以前匹配的初始索引;

   .end() :返回最后匹配字符之后的偏移量(结束索引)

   .find(int start) :重置匹配器,然后再开始查找;

   .reset() :重置匹配器。

【注:(重点)因为同一个匹配器中方法使用同一个索引,当一个方法使用移动了索引位后,如果没有重置匹配器,那么就是从移动后当前的索引位开始查找。】

 

五、其他:

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地址进行排序"192.168.1.1 8.8.8.8 10.10.10.10 255.255.255.0"等;

        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、想要拿到符合需求的字符子串,获取(即获取符合规则的子串)。

 

各功能实现代码详见:  “其他,仅参考工具.rar”的“15PatternTool.java”文件。

下载地址: http://dl.vmall.com/c0wq3ikwbx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值