java正则表达式:

来源:互联网 发布:淘宝网秋冬季节短裙子 编辑:程序博客网 时间:2024/06/06 17:07

正则表达式是一个强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作。
String类里也提供了如下几个特殊的方法:
(1)boolean matches(String regex) 判断该字符串是否匹配指定的正则表达式。
(2)String replaceAll(String regex,String replacement) 将该字符串中所有匹配regex的字串替换成replacement
(3)String replacementFirst(String regex,String replacement) 将该字符串第一个匹配regex的字符串替换成replacement
(4)String [] split(String regex) 以regex作为分隔符,将字符串分割为多个字串

这些方法都依赖java提供的正则表达式提供支持,此外,java还提供了Patter和Matcher两个类专门提供正则表达式支持。

————————————————————————————————————————————————————
创建正则表达式:
正则表达式是一个用于匹配字符串的模板,可以匹配一批字符串,创建正则表达式就是创建一个特殊的字符串。

(1)正则表达式支持的合法字符
x 字符x(x可以代表所有合法的字符)
\0mnn 八进制数0mnn所代表的字符
\xhh 十六进制0xhhhh所代表的字符
\uhhhh 十六进制0xhhhh所表示的Unicode字符
\t 制表符(‘\u009’)
\n 换行符(’\u000A’)
\r 回车符(’\u000D’)
\f 换页符(’\u000C’)
\a 报警(bell)符(’\u0007’)
\e Escape符(’\u001B’)
\cx x对应的控制符。例如 \cM匹配Ctrl-M x的值必须为A~Z或a~z之一

————————————————————————————————————————————
除此之外,正则表达式中有一些特殊字符,这些特殊字符在正则表达式中有特殊的用途,比如反斜杠(\),如果需要匹配这些字符,就必须先将这些字符转义,也就是在前面加一个反斜杠(\)。特殊字符如下
本身,用$
^ 匹配一行的开头 , 要匹配本身,用\^
() 标记子表达式的开始和结束位置 ,要匹配本身,用( )
[ ] 用于确定中括号表达式的开始和结束位置。要匹配本身,用[ ]
{} 用于表示前面子表达式出现频度,要匹配本身,用{ }
* 指定前面子表达式可以出现零次或多次,要匹配本身,用 *
+ 指定前面表达式可以出现一次或者多次 要匹配本身,用+
? 指定前面表达式可以出现零次或一次 要匹配本身,用\?
. 匹配除开换行符之外所有的字符,要匹配本身,用 .\
\ 用于转义下一个字符,或指定八进制。十进制字符,要匹配本身,用\
| 指定两个选项中的任选一项,要匹配$本身,用 |

——————————————————————————————————————————————————————

将上面多个字符拼接起来,就可以创建一个正则表达式

“\u0041\\” 匹配A\
“\u0061\t” 匹配a<制表符>
“\?\[” 匹配?[


上面的正则表达式只能匹配单个字符,这是因为还未在这个表达式中使用通配符,通配符是可以匹配多个字符的特殊字符。正则表达式中的通配符远远超出了普通通配符的功能,它被称为预定义字符。
这里写图片描述

c\wt 可以匹配cat cbt cct c9t等一批字符串
\d\d\d-\d\d\d\d-\d\d\d\d可以匹配如000-000-0000形式的电话号码

这里写图片描述
方括号表达式比前面的预定义字符灵活很多,几乎可以匹配任何字符
——————————————————————————————————————————————
正则表达式还支持圆括号表达式,用于将多个表达式组成一个子表达式,圆括号中可以使用或运算符,例如正则表达式
((public)| (protected) | (private) )用于表示java的三个访问控制符

————————————————————————————————————————————————————————

正则表达式支持的数量标识符有如下几种模式:

(1)Greedy(贪婪模式):贪婪模式是一直匹配下去,直到无法匹配

(2)Reluctant(勉强模式):用问号(?)后缀表示,它只匹配最少的字符
(3)Possessive(占有模式):用加号后缀表示(+)目前只有java支持占有模式。

————————————————————————————————————————————
使用正则表达式:
一旦在程序中定义了正则表达式,就可以使用Pattern和Matcher来使用正则表达式。
Pattern对象是正则表达式编译后在内存中的表示形式,因此,正则表达式字符串必须先被编译成为Pattern对象,然后再利用该Pattern对象创建对应的Matcher对象。执行匹配所涉及的状态保留在Matcher对象中,多个Matcher对象可以共享一个Pattern对象。
典型的调用顺序如下:

//将一个字符串编译成Pattern对象
Pattern p=Pattern.compile(“a*b”);
//使用Pattern对象创建Matcher对象
Matcher m = p.matcher(“aaahdhhd”);
boolean b= m.matches();//返回true

——————————————————————————————————————————————————————————

Matcher类提供了如下几个常用方法。
find() 返回目标字符串中是否包含与Pattern匹配的字符串
group() 返回上一次与Pattern匹配的字串
start() 返回上一次与Pattern匹配的字串在目标字符串中的开始位置
end() 返回上一次与Pattern匹配的字串在目标字符串中的结束位置+1
lookingAt() 返回目标字符串前半部分与Pattern是否匹配。
matches() 返回整个目标字符串与Pattern是否匹配
reset() 将现有的Matcher对象应用于一个新的字符序列。

——————————————————————————————————————————————

通过Matcher类的find()和group()方法可以从目标字符串中依次提取出特定字串(匹配正则表达式子串),例如互联网的网络爬虫,他们可以从大段的网页中识别出所有的电话号码。下面程序示范了如何从大段的字符串中找出电话号码。

import java.util.regex.Matcher;import java.util.regex.Pattern;public class FindGroup{    public static void main(String[] args)    {        //使用字符串模拟从网上得到的网页源码        String  str = "斤斤计较斤斤计较136768677677"+"啦啦啦啦啦+13988873873"+"哈哈哈哈哈哈13588819281289";        //创建一个Pattern对象,并利用它建立一个Matcher对象        //该正则表达式只抓取  136    139   的手机号        Matcher  m = Pattern.compile("((136\\d)| (135\\d))\\d{8}").matcher(str);        //将所有符合正则表达式的子串全部输出        while(m.find()){        System.out.println(m.group());        }    }}

matches()和lookingAt()方法相似,只是matches()要求整个字符串与Pattern完全匹配时才返回true,而lookingAt只要求字符串以Pattern开头就返回true.
reset()方法可将现有的Matcher对象应用于新的字符序列。

import java.util.regex.Matcher;import java.util.regex.Pattern;public class MatchesTest{    public static void main(String[] args)    {        String [] mails ={"zoulv@163.com","zoulvzhou@gmail.com","zzz@hhh.org","eedw@abc.xx"};        String  mailRegEx ="\\w{3,20}@\\w+\\.(com|org|cn|net|goy)";        Pattern mailPattern = Pattern.compile(mailRegEx);        Matcher matcher=null;        for(String mail:mails){        if(matcher == null){        matcher = mailPattern.matcher(mail);        }        else{        matcher.reset(mail);        }        String result =mail+(matcher.matches() ? "是" :"不是")+"一个有效的邮件地址";        System.out.println(result);        }    }}
0 0