java 正则表达式

来源:互联网 发布:mac autotools 编辑:程序博客网 时间:2024/04/30 10:30
本文学习并总结java中正则表达式语法及其具体功能。使用正则表达式可以非常方便灵活地操作字符串,在实际项目开发中也很实用。

正则表达式
符合一定规则的表达式。
作用:用于专门操作字符串。
特点:用一些特定符号来表示一些代码操作,这样就可以简化书写;学习正则表达式就是在学习一些特殊符号的使用。

基本正则表达式语法
下面这些基本正则表达式及语法以jdk 1.6手册中都有,这里记录在这,以方便可以网络方式查阅。

字符类:[ ]代表一个字符位上出现的字符
[abc]:a、b或c
[^abc]:任何字符,除了a、b或c
[a-zA-Z]:a到z或A到Z的任何字符,包含2头的字母在内
[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],\f是换页符,\xhh指带有十六进制值的字符hh
\S:非空白字符,[^\s]
\w:单词字符,[a-zA-Z0-9]
\W:非单词字符
java中反斜杠'\'有转义作用,会将后面紧跟的字符转义,所以上面预定义字符(除.)使用时,前面还要再一个反斜杠,表示r后面是一个整体,不转义。

边界匹配器
^:行的开头
$:行的结尾,\n、\r、\r\n、\u0085、\u2028(行分隔符)、\u2029(段落分隔符)都被认为是行结束符
\b:单词边界
\B:非单词边界
\A:输入的开头
\G:上一个匹配的结尾
\Z:输入的结尾,仅用于最后的结束符(如果有的话)
\z:输入的结尾

数量词
X?:X出现一次或一次也没有
X*:X出现零次或多次
X+:X出现一次或多次
X{n}:X出现恰好n次
X{n,}:X出现至少n次
X{n,m}:X出现至少n次,但不超过m次。

正则表达式组
()括起来的代表一个正则表达式组,组的出现都有编号,从1开始,想要使用已有的组,可通过\n(n是组的编号)的形式来获取。
((A)(B(C)))表达式里有4个组:
1-((A)(B(C)))
2-\A
3-(B(C))
4-(C)
组零使用代表整个字符串。

正则表达式功能及用法

1. 匹配

boolean matches(String regex),String类中的方法,用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
常用的匹配正则表达式
QQ号:[0-9]\\d{4,14}

手机号:1[358]\\d{9}
叠词:(.)\\1+
邮件:较为精确的匹配:[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+
           相对不太精确的匹配:\\w+@\\w+(\\.\\w+)+

2. 切割
String[] split(String regex),String类中的方法。
用空格切割时,正则表达式使用“ +”,可用于切割英文句子中的单词
用.来切割时,需要使用"\\.",可用于切割IP地址、英文全名等。

3. 替换
String replaceAll(String regex, String replacement),将满足正则表达式的所有子串替换成replacement代表的字符串,返回替换后的字符串。
将多个叠词替换成单个字母:replaceAll("(.)\\1+",”$1“),用$在外部获取前一个正则表达式中的组。

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

/*需求:取出字符串中长度为4的单词*/import java.util.regex.Matcher;import java.util.regex.Pattern;public class RegexDemo {public static void main(String[] args) {getDemo();}    public static void getDemo(){    String str="this is a brand new day, guys have your fun!";    String reg="\\b[a-z]{4}\\b";    //将规则封装成对象    Pattern p=Pattern.compile(reg);    //让正则对象与要操作的字符串相关联,获取匹配器对象    Matcher m=p.matcher(str);    //先匹配,将规则作用到字符串上,并进行符合规则的子串查找    while(m.find()){    //获取匹配后的结果    System.out.println(m.group());    //打印每个匹配的子串在整个字符串的开关索引和结尾索引    System.out.println(m.start()+"....."+m.end());    }    }}/*运行结果:this0.....4guys25.....29have30.....34your35.....39*/

这里简单介绍下上面代码中用的Matcher 匹配器类
无构造函数,类中有静态方法matcher()可以获取匹配器对象。
Matcher类有多个匹配字符串的操作方法,可以查阅jdk API手册,这里不再一一列出。
boolean matches(),将整个字符串与规则匹配,与String类中的matches方法类似;实际String类中的matches方法用的就是Pattern和Matcher对象来完成的,只不过被String封装后用起来较为简单,但功能却较为单一。
Matcher类中也有replaceAll()方法,Stirng类的replaceAll()方法也是使用了此方法。
Match类中还有方法可以获取匹配子串在整串中的索引:
int start(),返回上一个匹配的子串的初始索引。
int end(), 返回上一个匹配的子串的末尾索引(含头不含尾,子串中没有不包含该方法返回索引的字符)。

使用正则表示的示例代码:

1. 去掉小数后多余的0

/**      * 使用java正则表达式去掉多余的.与0      * @param s      * @return       */      public static String subZeroAndDot(String s){          if(s.indexOf(".") > 0){              s = s.replaceAll("0+?$", "");//去掉多余的0              s = s.replaceAll("[.]$", "");//如最后一位是.则去掉          }          return s;      }  

正则表达式使用思考方式:
1. 如果只想知道该字符的对错,使用匹配
2. 想要将已有的字符串变成另一个字符串,使用替换
3. 想要按照自定义的方式将字符串变成多个字符串,使用切割,得到的是规则以外的子串
4. 想要拿到符合需求的字符串子串,使用获取,得到的是符合规则的子串。





0 0