黑马程序员——Java语言基础——09.正则表达式

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

1-1 正则表达式概述

正则表达式:符合一定规则的表达式。
作用:用于专门操作字符串。
特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。
所以学习正则表达式,就是在学习一些特殊符号的使用。
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性越差。

1-2 常用预定义类

java中正则表达式工具在 java.util.regex包中。
字符类
[abc]abc(简单类)
[^abc]任何字符,除了 abc(否定)
[a-zA-Z]azAZ,两头的字母包括在内(范围)
[a-d[m-p]]admp[a-dm-p](并集)
[a-z&&[def]]def(交集)
[a-z&&[^bc]]az,除了 bc[ad-z](减去)
[a-z&&[^m-p]]az,而非 mp[a-lq-z](减去)
预定义字符类
.任何字符(与行结束符可能匹配也可能不匹配)
\d数字:[0-9]
\D非数字: [^0-9]
\s空白字符:[ \t\n\x0B\f\r]
\S非空白字符:[^\s]
\w单词字符:[a-zA-Z_0-9]
\W非单词字符:[^\w]
边界匹配器
^行的开头
$行的结尾
\b单词边界
\B非单词边界
\A输入的开头
\G上一个匹配的结尾
\Z输入的结尾,仅用于最后的结束符(如果有的话)
\z输入的结尾
Greedy 数量词
X?X,一次或一次也没有
X*X,零次或多次
X+X,一次或多次
X{n}X,恰好 n
X{n,}X,至少 n
X{n,m}X,至少 n 次,但是不超过 m

1-3 常用操作

1-3-1 匹配

String类中的matches方法。
用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
匹配示例:
class RegexDemo
{
	public static void main(String[] args)
	{
		matchMail();
	}

	//匹配QQ号
	public static void match()
	{
		String s1 = "12344533333";
		String regex = "[1-9][0-9]{4,10}";

		if (s1.matches(regex))
		{
			System.out.println("qq is right");
		}
		else
		{
			System.out.println("qq is wrong");
		}
		
	}

	//匹配手机号
	public static void matchPhone()
	{
		String s1 = "16799990000";
		String regex = "[1][358]\\d{9}";//反斜杠,不是斜杠

		if (s1.matches(regex))
		{
			System.out.println("PhoneNumber is right");
		}
		else
		{
			System.out.println("PhoneNumber is wrong");
		}
	}

	//匹配邮箱
	public static void matchMail()
	{
		String s1 = "22e@qq.com";
		String regex = "\\w+@\\w+(\\.[A-Za-z]+)+";

		if (s1.matches(regex))
		{
			System.out.println("Mail is right");
		}
		else
		{
			System.out.println("Mail is wrong");
		}
		
	}

}<span style="font-family: 'Microsoft YaHei'; background-color: rgb(255, 255, 255);">	</span>

1-3-2 切割

String类中的split方法。
切割示例:
class RegexSplit 
{
	public static void main(String[] args) 
	{
		split4();
	}

	//切割多个空格
	public static void split1()
	{
		String s1 = "ni si  sjidaj  s";
		String regex = " +";

		String[] s2 = s1.split(regex);

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

	//切割.因为.是所有字符的通配符,所以必须\转义,反斜杠必须同时出现一对
	public static void split2()
	{
		String s1 = "ni.si.sj.is";
		String regex = "\\.";

		String[] s2 = s1.split(regex);

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

	//切割反斜杠
	public static void split3()
	{
		String s1 = "ni\\si\\sj\\is";//字符串中出现反斜杠必须同时出现两次
		String regex = "\\\\";//因此切割双斜杠也必须出现两次*2

		String[] s2 = s1.split(regex);

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

	//切割叠词
	public static void split4()
	{
		String s1 = "niaashhskkd";
		String regex = "(\\w)\\1+";

		String[] s2 = s1.split(regex);

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

1-3-3 替换

String类中的replaceAll(regex,str);
如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组
组:

用小括号标示,每定义一个小括号,就是一个组,而且有自动编号,从1开始。

只要使用组,对应的数字就是使用该组的内容。

(aaa(wwww(ccc))(eee))有几个组?

小技巧,从左括号开始数,有几个左括号就是几组

替换示例:

class RegexReplace 
{
	public static void main(String[] args) 
	{
		replace2();
	}

	public static void replace1()
	{
		String s1 = "ndfbai1213243ubfi545644ab";
		String regex = "[\\d]{4,}";

		String s2 = s1.replaceAll(regex,"****");

		System.out.println(s2);
	}

	public static void replace2()
	{
		String s1 = "ndfbai22222ubfidddddddab";
		String regex = "(\\w)\\1+";

//
//		String s2 = s1.replaceAll(regex,"*");
		String s2 = s1.replaceAll(regex,"$1$1");//美元符号有特殊含义,$1表示获取符合前一个组中的符号,在外面获取组

		System.out.println(s2);
	}
}

1-3-4 获取

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

class RegexGet 
{
	public static void main(String[] args) 
	{
		get1();
	}

	public static void get1()
	{
		String s1 = "dni sjj shhd ssii dai";
		String regex = "\\b[a-zA-Z]{3}\\b";
		
		//将regex封装成对象
		Pattern p = Pattern.compile(regex);
		
		//将Pattern对象与字符串关联,并获取匹配器对象
		Matcher m = p.matcher(s1);

		while(m.find())//先找到符合要求的子串
		{
			String s2 = m.group();//返回之前匹配的子串
			System.out.println(s2);
			System.out.println(m.start()+"  "+m.end());
		}
	}
}

1-4 正则表达式练习

需求1:将下列字符串转成:我要学编程.

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

public class StringReplace {

	public static void main(String[] args) {
		String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程";
		String temp = str.replaceAll("\\.+", "");//将.替换为空字符
		System.out.println(temp);
		String d = temp.replaceAll("(.)\\1+", "$1");//美元符号取前一个组中的内容
		System.out.println(d);
	}

}

需求2:将下列ip地址进行地址段顺序的排序。

192.68.1.254 

102.49.23.13 

10.10.10.10 

2.2.2.2 

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

import java.util.TreeSet;

public class RegexDemo {

	public static void main(String[] args) {
		String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";
		String ip1 = ip.replaceAll("(\\d+)", "00$1");//在所有数字前补两个0
		String ip2 = ip1.replaceAll("0*(\\d{3})", "$1");//去除掉多余的一个0,所有数字都是三位
		String[] ip3 = ip2.split(" ");
		
		TreeSet<String> ts = new TreeSet<String>();
		
		for (String s : ip3)//存入TreeSet,排序
			ts.add(s);
		for(String s: ts)
			System.out.println(s.replaceAll("0*(\\d+)", "$1"));//去除掉所有多余的0
	}

}
正则应用,网页爬虫获取网页邮箱

/*
网页爬虫(蜘蛛)
*/
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();
	}


	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、付费专栏及课程。

余额充值