黑马程序员——java第二十五天:正则表达式

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

正则表达式(regex)

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

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

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

       特点:用于一些特定的符号来表示一些代码操作。

       学习正则表达式就是学习特殊符号的使用。

 

[abc]

——某一位置必须是a、b 或 c(简单类)

[^abc]

——某一位置是任何字符,除了 a、b 或 c(否定)

[a-zA-Z]

——a 到 z 或 A 到 Z,两头的字母包括在内(范围)

[a-d[m-p]]

——a 到 d 或 m 到 p:[a-dm-p](并集)

[a-z&&[def]]

——d、e 或 f(交集)

.

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

\d

——数字:[0-9]

例子:String reg=”[a-z]\\d”在字符串中单个\就把d转义了

\D

——非数字: [^0-9]

\s

——空白字符:[ \t\n\x0B\f\r]

\S

——非空白字符:[^\s]

\w

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

\W

——非单词字符:[^\w]

X?

——X,一次或一次也没有

例子:String reg=”[a-z]\\d?”;第一位a-z,第二位有可能数字有可能出现一次也有可能一次也没有

X*

——X,零次或多次符合这个规则的符号有可能出现0此也有可能多次

X+

——X,一次或多次

X{n}

——X,恰好 n 次

X{n,}

——X,至少 n 次

X{n,m}

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

 

 

1、匹配:

方法:String类 boolean  matches(String regex);

用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false

例:String qq=”12345”;

       String reg=”[1-9]\\d{4,15}”;//第一位是1-9第二位是0-9至少四个像第二位这样的数,最多15位;

       qq.matches(reg);

 

2、切割

String类 String[] split(String regex);根据给定的正则表达式的匹配拆分次字符串

例:String str=”zhangsan   lisi  wangwu”;

        String reg=” +”;

        String[]arr=str.split(reg);

 

特例:String str=”zhangsan.lisi.wangwu”;

        String reg=\\.”;//因为\.是把.转义了,.代表任意字符。\\.才是以.未切割符切割。

        String[]arr=str.split(reg);

 

特例2:String str=”c:\\abc\\a.txt”;

               Stringreg=”\\\\”;转义两个\。

               String[]arr=str.split(reg);

 

特例三:按照叠词完成切割。

               可以把规则分成组 ——用()把分割符括起来。

               组可以自动排序第一个()认为第一组,以此类推。

               封装在同一个字符串中的组和组的调用可以用\1代表此位置遵循第一组规则\n代表遵循第n组规则。例(.)\1;表示两位第一位用.匹配,第二位也用第一组的规则匹配。

String str=”erkktyqqquizzzo”;

String reg=”(.)\\1+”;

String[] arr=str.split(reg);

总结:为了可以让规则的结果被重用可以将规则封装成一个组,用()完成。组的出现都有序号(从1开始)。想要使用已有的组可以通过\n(n就是组的编号)的形式获取。

例:((A)(B(C)));要看几组看左括号有几个

              1        ((A)(B(C)))

2        \A

3        (B(C))

4       (C)

 

3、替换

方法:

 String

replaceAll(String regex,String replacement)
          使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。

例:String str=”wei1289980000try122344qq”;

        String reg=\\d{5,};

        String newStr=”#”;

        str=str.replaceAll(reg,newStr);

 

特例:将重叠的字符替换成单个字母。zzz—z;

(组的调用两种:封装在同一个字符串中用\n;不封装在同一个字符串中用$n(n代表组));

String str=”werkktyggguizzzz0o”;

String reg=”(.)\\1+”;

String reg=”$1”;

str=replaceAll(reg,newStr);

 

4、获取:将字符串符合规则的字串取出。

操作步骤:

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

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

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

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

 

类Pattern(在java.util.regex包中)没有构造方法。

指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。

因此,典型的调用顺序是

         Pattern p = Pattern.compile("a*b");

         Matcher m = p.matcher("aaaaab");

         boolean b = m.matches();

在仅使用一次正则表达式时,可以方便地通过此类定义 matches方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句

         boolean b = Pattern.matches("a*b","aaaaab");

等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。

 

方法:

static Pattern

compile(String regex)
          将给定的正则表达式编译到模式中。

Matcher

matcher(CharSequence input)
          创建匹配给定输入与此模式的匹配器。

 

Matcher:通过解释Pattern对charactersequence执行匹配操作的引擎

       通过调用模式的 matcher方法从模式创建匹配器。创建匹配器后,可以使用它执行三种不同的匹配操作:

  • matches 方法尝试将整个输入序列与该模式匹配。
  • lookingAt 尝试将输入序列从头开始与该模式匹配。
  • find 方法扫描输入序列以查找与该模式匹配的下一个子序列。

每个方法都返回一个表示成功或失败的布尔值。通过查询匹配器的状态可以获取关于成功匹配的更多信息。

 

方法:

 String

group()
(用于返回匹配后的结果) 返回由以前匹配操作所匹配的输入子序列。

单词边界:\b

 

例:

importjava.util.regex.*;
 
class RegexDemo2
{
       public static voidmain(String[] args)
       {
              getDemo();
       }
       public static voidgetDemo()
       {
              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的方法封装后,用起来较为简单。但是功能却单一。
 
//           boolean b =m.find();//将规则作用到字符串上,并进行符合规则的子串查找。
//           System.out.println(b);
//           System.out.println(m.group());//用于获取匹配后结果。
             
             
              //System.out.println("matches:"+m.matches());
              while(m.find())
              {
                     System.out.println(m.group());
                     System.out.println(m.start()+"...."+m.end());
              }
       }
}

/*
网页爬虫(蜘蛛)
*/
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培训、期待与您交流! ----------详细请查看:http://edu.csdn.net

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值