黑马程序员--正则表达式

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

大纲:

        一、正则表达式概述

        二、正则表达式的基本应用

        三、正则表达式对象、匹配器对象(Pattern与Matcher)

        四、正则表达式总结

        五、对ip地址进行排序。

        六、邮箱格式校验

        七、网页爬虫

一、正则表达式概述

正则表达式:符合一定规则的表达式。
作用:用于专门操作字符串。
特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性越差。
具体操作功能:
1,匹配:String  matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
2,切割:String split();
3,替换:String replaceAll(regex,str);如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。

二、正则表达式的基本应用

1、匹配示例代码

需求:手机有11位数字且以13、15、18开头开头,号码不符合规则的返回false

String tel = "16900001111";
String telReg = "1[358]\\d{9}";
System.out.println(tel.matches(telReg));

结果返回false因为第二位数字是6不在(3,5,8)之中

2、切割示例代码

(1)      String[] arr = "zhangsan.lisi.wangwu".split("\\.");  

System.out.println(arr.length);
for(String s : arr)
{
System.out.println(s);
}

             返回的数组长度是3,字符串被切割成3份。

(2)  String[] arr = "zhangsan  lisi        wan    gwu".split("  +");  

             返回的数组长度是4,是按一个或多个空格来分割

(3)  String[] arr = "c:\\abc\\a.txt".split("\\\\");  

    数组长度是3          

(4)按照叠词切割

             String[] arr = "erkktyqqquizzzzzo".split("(.)\\1+");  

             字符串被切割成er ty ui o

             String[] arr = "erkktyqyqquizzzzzo".split("(..)\\1");  

             字符串被分隔成erkkt   qui   zo

由此可得出结论在(..)中“.”代表任意字符,()里面的字符是一组,

\\1代表和(..)一样的一组字符,\\1+代表和(..)一样的一组或多组字符。

叠词解析

按照叠词完成切割是为了可以让规则的结果被重用,可以将规则封装成一个组。

用()完成。组的出现都有编号,从1开始。 想要使用已有的组可以通过  \n(n就是组的编号)的形式来获取。

             String[] arr = "erkktyqqyquizzzzzo".split("(.)(.)\\2");  //前一个字符任意,后两个字符一样

此字符串是按rkk、yqq、izz、zzz切割的,数组长度是5,结果是e  t  yqu        o

3、替换示例代码

(1)String str = we5r1389980000ty1234564uiod234345675f

          str = str.replaceAll(”\\d{5,}“,“#”);

          str结果是we5r#ty#uiod#f

         只有数字连续5个以上的才被#所替换

(2)//将叠词替换成$.  将重叠的字符替换成单个字母。zzzz->z

         String str = "erkktyqqquizzzzzo";

          str = str.replaceAll("(.)\\1+","$1");

          str结果是erktyquizo

          str = str.replaceAll("(.)(.)\\2+","$2");

          str结果是 ektquzo


校验QQ号示例代码:

qq号不能以0开头,是5-15位的数字

1、传统方式

                String qq = "1882345a0";
		int len = qq.length();
		if (len >= 5 && len <= 15) {
			if (!qq.startsWith("0"))// Integer.parseInt("12a");NumberFormatException
			{
				try {
					long l = Long.parseLong(qq);
					System.out.println("qq:" + l);
				} catch (NumberFormatException e) {
					System.out.println("出现非法字符.......");
				}

				char[] arr = qq.toCharArray();// 123a4
				boolean flag = true;
				for (int x = 0; x < arr.length; x++) {
					if (!(arr[x] >= '0' && arr[x] <= '9')) {
						flag = false;
						break;
					}
				}
				if (flag) {
					System.out.println("qq:" + qq);
				} else {
					System.out.println("出现非法字符");
				}

			} else {
				System.out.println("不可以0开头");

			}
		} else {
			System.out.println("长度错误");
		}
2、正则方式

		String qq = "123a454";
		String regex = "[1-9]\\d{4,14}";
		boolean flag = qq.matches(regex);
		if (flag)
			System.out.println(qq + "...is ok");
		else
			System.out.println(qq + "... 不合法")

三、正则表达式对象、匹配器对象(Pattern与Matcher)

操作步骤:
1,将正则表达式封装成对象。
2,让正则对象和要操作的字符串相关联。
3,关联后,获取正则匹配引擎。
4,通过引擎对符合规则的子串进行操作,比如取出。

1、匹配器对象的简单应用

                String str = "ming tian jiu yao fang jia le ,da jia。";
		String reg = "[a-z]{4,}";

		//将规则封装成对象。
		Pattern p = Pattern.compile(reg);
		//让正则对象和要作用的字符串相关联。获取匹配器对象。
		Matcher m  = p.matcher(str);
		System.out.println(m.matches());

其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。

以上代码就等同于str.matches(reg);

只不过被String的方法封装后,用起来较为简单。但是功能却单一。

2、获取:将字符串中的符合规则的子串取出(获取长度是4的单词)

		String str = "ming tian jiu yao fang jia le ,dayu jia。";
		System.out.println(str);
		String reg = "\\b[a-z]{4}\\b";

		//将规则封装成对象。
		Pattern p = Pattern.compile(reg);
		//让正则对象和要作用的字符串相关联。获取匹配器对象。
		Matcher m  = p.matcher(str);
		boolean b = m.find();//将规则作用到字符串上,并进行符合规则的子串查找。
		System.out.println(b);
		System.out.println(m.group());//用于获取匹配后结果。
结果是ming,\\b保证取出的是单词。

3、将长度为4的单词全部取出

		String str = "ming tian jiu yao fang jia le ,dayu jia。";
		System.out.println(str);
		String reg = "\\b[a-z]{4}\\b";

		Pattern p = Pattern.compile(reg);
		Matcher m  = p.matcher(str);
		while(m.find())
		{
			System.out.println(m.group());
			System.out.println(m.start()+"...."+m.end());
		}

结果是:

ming
0....4
tian
5....9
fang
18....22
dayu
31....35

解析:m.group()返回的是 m.find()所找到的符合规则的单词,此单词的下标

开始是m.start() 结束是 m.end()-1

四、正则表达式总结

到底用四种功能中的哪一个呢?或者哪几个呢?
思路方式:
1,如果只想知道该字符是否对是错,使用匹配。
2,想要将已有的字符串变成另一个字符串,替换。
3,想要按照自定的方式将字符串变成多个字符串,切割。获取规则以外的子串。
4,想要拿到符合需求的字符串子串,获取。获取符合规则的子串。
*/

按以上思路将下列字符串转成:我要学编程

		String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程";
		/*
		将已有字符串变成另一个字符串。使用 替换功能。
		1,可以先将 . 去掉。
		2,在将多个重复的内容变成单个内容。
		*/
		str = str.replaceAll("\\.+","");
		System.out.println(str);
		str = str.replaceAll("(.)\\1+","$1");
		System.out.println(str);

五、对ip地址进行排序。

192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30
将ip地址进行地址段顺序的排序。
还按照字符串自然顺序,只要让它们每一段都是3位即可。
1,按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。
2,将每一段只保留3位。这样,所有的ip地址都是每一段3位。

String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";

		ip = ip.replaceAll("(\\d+)","00$1");
		System.out.println(ip);

		ip = ip.replaceAll("0*(\\d{3})","$1");
		System.out.println(ip);
		String[] arr = ip.split(" ");
		TreeSet<String> ts = new TreeSet<String>();
		for(String s : arr)
		{
			ts.add(s);
		}

		for(String s : ts)
		{
			System.out.println(s.replaceAll("0*(\\d+)","$1"));
		}

六、邮箱格式校验

String mail = "abc12@sina.com";
String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//较为精确的匹配。
reg = "\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配。mail = "1@1.1";也能通过

七、网页爬虫

将一个文本里的邮箱全部提取出来

/*
网页爬虫(蜘蛛)
*/
import java.io.*;
import java.util.regex.*;
import java.net.*;
import java.util.*;
class RegexTest2 
{
	public static void main(String[] args) throws Exception
	{
		getMails_1();
	}

<span style="white-space:pre">	</span>//获取网页中的邮箱地址
	public static void getMails_1()throws Exception
	{
		URL url = new URL("http://192.168.1.254:8080/myweb/mail.html");
		URLConnection conn = url.openConnection();
		BufferedReader bufIn = new BufferedReader(new InputStreamReader(conn.getInputStream()));
		String line = null;
		String mailreg = "\\w+@\\w+(\\.\\w+)+";
		Pattern p = Pattern.compile(mailreg);
		while((line=bufIn.readLine())!=null)
		{
			Matcher m = p.matcher(line);
			while(m.find())
			{
				System.out.println(m.group());
			}
		}
	}

	/*
	获取指定文档中的邮件地址。
	使用获取功能。Pattern  Matcher
	*/
	public static void getMails()throws Exception
	{
		BufferedReader bufr = 
			new BufferedReader(new FileReader("mail.txt"));

		String line = null;
		String mailreg = "\\w+@\\w+(\\.\\w+)+";
		Pattern p = Pattern.compile(mailreg);
		while((line=bufr.readLine())!=null)
		{
			Matcher m = p.matcher(line);
			while(m.find())
			{
				System.out.println(m.group());
			}
		}
	}
}

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





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值