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

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------


正则表达式:符合一定规则的表达式,用于操作字符串。

功能:

1.匹配:boolean matches();如果匹配整个字符串,只要有一处不符合,就匹配结束,返回false。例如:
//检测手机号码,号码格式必须要以13,15,18开头的11位数字
public static void checkTel(String tel) {
	String telReg = “1[358]\\d{9}”;
	//这串正则表达式的意思就是以数字1开头,3,5,8作为第二位数字。任意数字作为第三位数字并且连续出现9次
	boolean b = tel.matches(reg);
	System.out.println(b);
}

2.切割:String[] split() 把符合规则的字符串都排除在外。
//例如有一串字符串,中间有多个空格。按照多个空格切
public static void splitDemo(String str) {
	String reg = “ +”;//空格出现了一次或者多次的时候,符合正则表达式
	String[] arr = str.split(“reg”);
	for(String s : arr) {
	System.out.println(s);
}

3.替换:String replaceAll(regex, str) 把符合规则的字符串都替换掉
//例如:有一段字符串erkktyqqquizzzzzo。把叠词都替换成#号
String str = “erkktyqqquizzzzzo”;
String reg = “(.)\\1+”; // .代表任意字符,括号括起来的代表为组。\1代表组的编号
str.replaceAll(reg, “#$1”);// $1代表序号为1的组

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

代码示例:
//将一段字符串中,长度为3的单词取出
String str = “ming tian jiu yao fang jia le , da jia”;
String reg = “\\b[a-z]{3}\\b”; // \b代表单词边界符
//将规则封装成对象
Pattern p = Pattern.compile(reg);
//让正则表达式和要作用的字符串关联,获取匹配器对象
Matcher m = p.matcher(str);
while(m.find()) { //find方法会去寻找符合规则的字符串
System.out.println(m.group()); }//group方法为取出

· 思考:正则表达式的4种功能,什么时候该用哪一个呢?

思路方式:

1. 如果只想知道该字符串是否对错,使用匹配

2. 想要将已有的字符串变成另一个字符串,替换

3. 想要按照自己定义的方式将一个字符串变成多个字符串。切割,获取规则以外的子串

4. 想要拿到符合需求的字符串子串,获取,获取符合规则的子串

 在正则表达式中,有很多表现形式:

常用的有:

字符类:

[abc] : 代表单个字符,这个字符可以是a/b/c中的一个

[^abc] : 代表单个字符,这个字符可以是除了abc的任意一个

[a-zA-Z] :代表单个字符,这个字符是a-zA-Z中的一个

[a-d[m-p]] :并集的方法

[a-z&&[def]] :交集的方法

 

预定义字符类:

: 任何字符

\d : 数字[0-9]

\D : 非数字

\s : 空白字符

\S : 非空白字符

\w : 单词字符[a-zA-Z_0-9]

\W : 非单词字符

 

边界匹配器:

行的开头

行的结尾

\b 单词的边界

\B 非单词的边界

 

数量词

X? 一次或者一次没有

X* 零次或者多次

X+ 一次或者多次

X{n} 恰好n

X{n,} 最少n

X{n,m} 至少n次,不超过m

 

被括号括起来是为组,在组的后面有个\nn就是组的序号。通过$n可以调用组的内容


正则表达式的代码示例:

1. 对邮件地址进行校验

public static void checkMail()
{
	String mail = "[email protected]";

	mail = "[email protected]";

	String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//较为精确的匹配。
	reg = "\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配。

	//mail.indexOf("@")!=-1


	System.out.println(mail.matches(reg));
}
2. 将下列字符串转成:我要学编程
public static void test()
{
	String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程";
	/*
	将已有字符串变成另一个字符串。使用 替换功能。
	1,可以先将 . 去掉。
	2,再将多个重复的内容变成单个内容。
	*/
	str = str.replaceAll("\\.+","");

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

}

网络爬虫程序:对网页的字符串进行校验,获取有用的信息。比如:别人的邮箱

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


	public static void getMails()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());
			}
		}
	}

}




你可能感兴趣的:(java,黑马程序员)