黑马程序员—正则表达式

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

1.正则表达式概念

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,
组成一个规则字符串,这个规则字符串用来表达对字符串的一种过滤逻辑。

2.正则表达式特点:

1. 灵活性、逻辑性和功能性非常的强;
2.
可以迅速地用极简单的方式达到字符串的复杂控制。
3.
对于刚接触的人来说,比较晦涩难懂。

3.正则表达式构造

构造匹配 
  
字符 
x
字符
\\
反斜线字符 
\0n
带有八进制值 0 的字符 n (0 <= n <=7) 
\0nn
带有八进制值 0 的字符 nn (0 <= n <=7) 
\0mnn
带有八进制值 0 的字符 mnn0<= m <= 30 <= n <= 7 
\xhh
带有十六进制值 0x 的字符 hh


\t
制表符 ('\u0009') 
\n
新行(换行)符 ('\u000A') 
\r
回车符 ('\u000D') 
\f
换页符 ('\u000C') 
\a
报警 (bell) ('\u0007') 
\e
转义符 ('\u001B') 
\cx
对应于 x 的控制符 
  
字符类 
[abc] a
b c(简单类) 
[^abc]
任何字符,除了 ab 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(交集) 
[a-z&&[^bc]] a
z,除了 b c[ad-z](减去) 
[a-z&&[^m-p]] a
z,而非 m p[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] 
  
POSIX
字符类(仅 US-ASCII 
\p{Lower}
小写字母字符:[a-z] 
\p{Upper}
大写字母字符:[A-Z] 
\p{ASCII}
所有 ASCII[\x00-\x7F] 
\p{Alpha}
字母字符:[\p{Lower}\p{Upper}] 
\p{Digit}
十进制数字:[0-9] 
\p{Alnum}
字母数字字符:[\p{Alpha}\p{Digit}] 
\p{Punct}
标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ 
\p{Graph}
可见字符:[\p{Alnum}\p{Punct}] 
\p{Print}
可打印字符:[\p{Graph}\x20] 
\p{Blank}
空格或制表符:[ \t] 
\p{Cntrl}
控制字符:[\x00-\x1F\x7F] 
\p{XDigit}
十六进制数字:[0-9a-fA-F] 
\p{Space}
空白字符:[ \t\n\x0B\f\r] 
  
java.lang.Character
类(简单的 java 字符类型) 
\p{javaLowerCase}
等效于java.lang.Character.isLowerCase() 
\p{javaUpperCase}
等效于java.lang.Character.isUpperCase() 
\p{javaWhitespace}
等效于java.lang.Character.isWhitespace() 
\p{javaMirrored}
等效于 java.lang.Character.isMirrored() 
  
Unicode
块和类别的类 
\p{InGreek} Greek
块(简单块)中的字符 
\p{Lu}
大写字母(简单类别) 
\p{Sc}
货币符号 
\P{InGreek}
所有字符,Greek 块中的除外(否定) 
[\p{L}&&[^\p{Lu}]]  
所有字母,大写字母除外(减去) 
  
边界匹配器 
^
行的开头 
$
行的结尾 
\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  
  
Reluctant
数量词 
X?? X
,一次或一次也没有 
X*? X
,零次或多次 
X+? X
,一次或多次 
X{n}? X
,恰好 n  
X{n,}? X
,至少 n  
X{n,m}? X
,至少 n 次,但是不超过 m  
  
Possessive
数量词 
X?+ X
,一次或一次也没有 
X*+ X
,零次或多次 
X++ X
,一次或多次 
X{n}+ X
,恰好 n  
X{n,}+ X
,至少 n  
X{n,m}+ X
,至少 n 次,但是不超过 m  
  
Logical
运算符 
XY X
后跟
X|Y X

(X) X
,作为捕获组 
  
Back
引用 
\n
任何匹配的 nth 捕获组 
  
引用 
\ Nothing
,但是引用以下字符 
\Q Nothing
,但是引用所有字符,直到 \E 
\E Nothing
,但是结束从 \Q 开始的引用 
  
特殊构造(非捕获) 
(?:X) X
,作为非捕获组 
(?idmsux-idmsux)  Nothing
,但是将匹配标志i d m s u x on - off 
(?idmsux-idmsux:X)   X
,作为带有给定标志 i d m s u x on - off 
的非捕获组  (?=X) X,通过零宽度的正 lookahead 
(?!X) X
,通过零宽度的负 lookahead 
(?<=X) X
,通过零宽度的正 lookbehind ……
(?<!X) X
,通过零宽度的负 lookbehind 
(?>X) X
,作为独立的非捕获组

4.正则表达式的使用:

4.1匹配

//正则表达式使用示例:匹配,String的matches方法;  
 	//切割:用String的split方法;  
 	//替换:String的replaceAll(String reg, String newStr)方法;  
 	  
 	import java.io.*;  
 	  
 	public class RegexDemo1  
 	{  
 	    public static void main(String [] args) throws Exception  
 	    {  
 	        //重复字母替换为‘$’;  
 	        rep("abccdefffghiiiijk", "(.)\\1+","$1");   //$表示正则表达式中的组,后面加上1表示$仅代表第一个组;  
 	        //splitStr("abccdefffghiiiijk","(.)\\1+");  
 	        //splitStr("abc.defg.hij","\\.");  
 	        //splitStr("F:\\黑马\\代码\\第25天代码-正则表达式","\\\\");  
 	        //matchTel();     
 	    }  
 	      
 	    //替换;  
 	    public static void rep(String str, String reg, String newStr)  
 	    {  
 	        str = str.replaceAll(reg,newStr);  
 	        sop(str);  
 	    }  
 	      
 	    //切割  
 	    public static void splitStr(String str, String reg)  
 	    {  
 	        String[] strs = str.split(reg);  
 	        for(String stri : strs)  
 	        {  
 	            sop(stri);    
 	        }     
 	    }  
 	      
 	    //对qq号的匹配:要求qq号长度在5到13之间,全部是数字,首位数字不能是0;  
 	    public static void matchQQ() throws IOException  
 	    {  
 	            String qq = null;  
 	            String reg = "[1-9]\\d{4,12}";      //匹配规则;  
 	              
 	            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
 	              
 	            sop("请输入qq号!");  
 	            while((qq = br.readLine()) != null)  
 	            {  
 	                sop(qq.matches(reg));  
 	            }  
 	              
 	            br.close();  
 	    }  
 	      
 	    //对手机号的匹配:手机号长度在11位,全部都是数字,首位必须是1,第二位是3、5或8;  
 	    public static void matchTel() throws IOException  
 	    {  
 	            String tel = null;  
 	            String reg = "1[358]\\d{9}";        //匹配规则;  
 	            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
 	              
 	            sop("请输入手机号!");  
 	            while((tel = br.readLine()) != null)  
 	            {  
 	                sop(tel.matches(reg));  
 	            }  
 	              
 	            br.close();  
 	    }     
 	      
 	    public static void sop(Object obj)  
 	    {  
 	            System.out.println(obj);      
 	    }  
 	}

4.2切割

将字符串按照一定的规则分割成字符串数组,得到的是规则以外的子字符串,Stringsplit方法

4.3替换

将字符串按照一定的规则用另外的字符串替换掉,StringreplaceAllString reg, String newStr

4.4组

为了让规则可以重用,我们可以将规则封装为组,组的表现形式为一对(),每个组都有编号,编号从1开始,后面要重复使用前面的组,就要用“\\n+”,表示在第n组后面会出现一到多个与前面重复的组,n为编号,示例:

   splitStr("abccdefffghiiiijk","(.)\\1+")

4.5获取

获取符合规则的子字符串:

   将正则表达式封装为对象:Pattern的compile方法;

   将正则表达式对象与要操作的字符串关联起来:Pattern的matcher方法;

   关联后,获取正则匹配器;

    通过匹配器对符合规则的字符串进行操作:Matcher 的相关方法

//网页爬虫(蜘蛛):按照正则表达式的规则搜索网页或者文档中的内容,搜索到符合规则的内容,  
 	//就将其输出或单独保存起来;  
 	  
 	import java.util.regex.*;  
 	import java.io.*;  
 	import java.net.*;  
 	  
 	public class Spider  
 	{  
 	    public static void main(String [] args) throws IOException  
 	    {  
 	            netSpider();  
 	            //spider();  
 	    }  
 	      
 	    //获取网页中的mail地址,使用正则表达式的获取功能;  
 	    public static void netSpider() throws IOException  
 	    {  
 	        //获取网页的url地址;  
 	        URL  url = new URL("http://192.168.1.254:8080/myweb/mail.html");  
 	        //创建url连接;  
 	        URLConnection conn = url.openConnection();  
 	        BufferedReader bufIn = new BufferedReader(new InputStreamReader(conn.getInputStream()));  
 	          
 	        String line = null;  
 	        String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";  
 	          
 	        Pattern patt = Pattern.compile(regex);  
 	          
 	        while((line = bufIn.readLine()) != null)  
 	        {  
 	                Matcher mat = patt.matcher(line);  
 	                while(mat.find())  
 	                {  
 	                    System.out.println(mat.group());      
 	                }  
 	        }  
 	    }  
 	      
 	    //获取指定文档中的mail地址,使用正则表达式的获取功能;  
 	    public static void spider() throws IOException  
 	    {  
 	            BufferedReader br = new BufferedReader(new FileReader("mail.txt"));  
 	            String line = null;  
 	            String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";  
 	              
 	            Pattern patt = Pattern.compile(regex);  
 	              
 	            while((line = br.readLine()) != null)  
 	            {  
 	                    Matcher mat = patt.matcher(line);  
 	                    while(mat.find())  
 	                    {  
 	                        System.out.println(mat.group());      
 	                    }  
 	            }  
 	    }  
 	}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值