黑马程序员 java_正则表达式(regex),网页爬虫

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

 

 

 

正则表达式

 

 

正则表达式是一种强大而灵活的文本处理工具。使用正则表达式我们可以对字符串进行复杂的操作。在运用中,关键是获取字符串和正则表达式相匹配的部分,只有获取了这部分,就可以

进行多种操作。

 

正则表达式 regex符合一定规则的表达式。

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

特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。

 

 

好处:可以简化对字符串的复杂操作。

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

 

 

常见符号

 

不同符号代表不同匹配规则

\\ 反斜线字符,表示一个反斜线、

[a]表示一个字符,此字符是a,还可以在中括号中添加数字。

[a-z]表示“a”到“z”之间的所有字符(包括两头)。

[a-zA-Z]    a 到 z 或 A 到 Z,两头的字母包括在内(范围)。

[^abc] 任何字符,除了 a、b 或 c(否定)。

. 任何字符(与行结束符可能匹配也可能不匹配)。

\d 数字:[0-9]。

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

X*     数量词,表示X在字符串中出现零次或多次

X+    一次或多次

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

(A)表示一个组,在字符串中确定一个组后,会索引后面的字符串,寻找相同的组,并进行预订操作。

 

 

具体操作功能:

 

1,匹配:String  matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。

 

2,切割:String split();

 

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

package itcast.heima;

public class RegexDemo {
      public static void main(String[] args) {
    	  
    	  
    	  demo();
    	  //用"."来拆分字符串,由于在正则表达式中"."代表任何字符,
    	  //所以要加上反斜线,又因为是在字符串中,故需加两根
    	  splitDemo("zhang.dfd.wangwu","\\.");
    	  //用匹配组的字串来拆分,
    	  splitDemo("erkkyafjdlfj","(.)\\1+");
    	  //如果字符串中有连续五个或更多数字,则将其换为"#"
    	  replaceAllDemo("dfj7778787df","\\d{5,}","#");
    	  String str1 = "luenf ossjfljfkk jlfss";
    	  //将叠词换为单个字符,(.)表示一个组,\\1+表示存在至少一个第一组,
    	  //$1表示第一组字符串
    	  replaceAllDemo(str1,"(.)\\1+","$1");
        }
      //替换
      public static void replaceAllDemo(String str,String reg,String newStr){
    	  //用newStr替代匹配reg的字符串
    	  str = str.replaceAll(reg, newStr);
    	  System.out.println(str);
      }
      //切割
      public static void splitDemo(String str,String reg){
    	  //用匹配reg的字符串来拆分字符串,并将拆分后的字符串存入数组
    	  String[] arr = str.split(reg);
    	  System.out.println(arr.length);
    	  for(String s:arr){
    		  System.out.println(s);
    	  }
      }
      //匹配
      public static void checkTel(){
    	  String tel = "3453805808";
    	  
    	  //规则:第一个元素为3,第二个元素为5或4或3,最后八个元素为数字
    	  String telReg = "3[543]\\d{8}";
    	  System.out.println(tel.matches(telReg));
      }
      //匹配
      public static void demo(){
    	  String str = "808deerer";
    	  
    	  //表示至少有一个元素,此元素可以是大小字母,也可为0-9的数字
    	  String reg = "[a-zA-Z_0-9]+";
    	  boolean b = str.matches(reg);
    	  System.out.println(b);
      }
    
}

 

正则表达式的第四个功能。

4,获取:将字符串中的符合规则的子串取出。

 

操作步骤:

 

(A)将正则表达式封装成对象。

Pattern 正则表达式的编译表示形式,就是一个正则对象。 

Pattern p = Pattern.compile(reg) 将正则表达式reg封装成对象p。

 

(B)让正则对象和要操作的字符串相关联,获取正则匹配引擎。

Mathcer对象代表执行匹配操作的引擎。

Matcher m  = p.matcher(str);让正则对象和要作用的字符串相关联。获取匹配器对象。

 

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

 

package itcast.heima;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexDemo2 {
	public static void main(String[] args) {
		getDemo();
	}
	public static void getDemo()
	{
		String str = "ming tian jiu yao fang jia le ,da jia。";
		System.out.println(str);
		String reg = "\\b[a-z]{4}\\b";

		//将规则封装成对象。
		Pattern p = Pattern.compile(reg);

		//让正则对象和要作用的字符串相关联。获取匹配器对象。
		Matcher m  = p.matcher(str);

		System.out.println(m.matches());
		//其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。
		//只不过被String的方法封装后,用起来较为简单。但是功能却单一。
	    //matches方法将改变匹配索引。下面的匹配将从ming后面开始											

		boolean b = m.find();
		//将规则作用到字符串上,并进行符合规则的子串查找。
		System.out.println(b);
		System.out.println(m.group());//用于获取匹配后结果。
		
	}
}

 

 

 

正则表达式的应用:

网页爬虫

 

 

可获取网页中的符合要求的内容,下面练习中用于获取网页中的邮件地址。

 

/*
网页爬虫(蜘蛛)
*/
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培训、期待与您交流! ----------

你可能感兴趣的:(正则表达式)