一.概述
正则表达式是Java处理字符串、文本的重要工具。
Java对正则表达式的处理集中在以下两个两个类:
java.util.regex.Matcher 模式类:用来表示一个编译过的正则表达式。
java.util.regex.Pattern 匹配类:用模式匹配一个字符串所表达的抽象结果。
实例:
package com.bijian.regex; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TestRegex { public static void main(String[] args) { Pattern p = Pattern.compile("f(.+?)k"); Matcher m = p.matcher("fckfkkfkf"); while (m.find()) { String s0 = m.group(); //fck||c String s1 = m.group(1); //fkk||k System.out.println(s0 + "||" + s1); } System.out.println("---------"); m.reset("fucking!"); while (m.find()) { System.out.println(m.group()); //fuck } Pattern p1 = Pattern.compile("f(.+?)i(.+?)h"); Matcher m1 = p1.matcher("finishabigfishfrish"); while (m1.find()) { String s0 = m1.group();//finish fishfrish String s1 = m1.group(1);//in ishfr String s2 = m1.group(2);//s s System.out.println(s0 + "||" + s1 + "||" + s2); } System.out.println("---------"); Pattern p3 = Pattern.compile("(19|20)\\d\\d([- /.])(0[1-9]|1[012])\\2(0[1-9]|[12][0-9]|3[01])"); Matcher m3 = p3.matcher("1900-01-01 2007/08/13 1900.01.01 1900 01 01 1900-01.01 1900 13 01 1900 02 31"); while (m3.find()) { System.out.println(m3.group()); //1900-01-01 //2007/08/13 //1900.01.01 //1900 01 01 //1900 02 31 } } }
运行结果:
fck||c fkk||k --------- fuck finish||in||s fishfrish||ishfr||s --------- 1900-01-01 2007/08/13 1900.01.01 1900 01 01 1900 02 31
二.一些容易迷糊的问题
1.Java对反斜线处理的问题
在其他语言中,\\表示要插入一个字符\;
在Java语言中,\\表示要插入正则表达式的反斜线,并且后面的字符有特殊意义。
看API文档:
预定义字符类 . 任何字符(与行结束符可能匹配也可能不匹配) \d 数字:[0-9] \D 非数字: [^0-9] \s 空白字符:[ \t\n\x0B\f\r] \S 非空白字符:[^\s] \w 单词字符:[a-zA-Z_0-9] \W 非单词字符:[^\w]
但是看看上面程序,对比下不难看出:\d在实际使用的时候就写成了\\d。
在Java正则表达式中,如果要插入一个\字符,则需要在正则表达式中写成\\\\,原因是下面的APIDoc定义\\表示一个反斜线。
但是如果在正则表示式中表示回车换行等,则不需要多添加反斜线了。比如回车\r就写作\r。
字符 x 字符 x \\ 反斜线字符 \0n 带有八进制值 0 的字符 n (0 <= n <= 7) \0nn 带有八进制值 0 的字符 nn (0 <= n <= 7) \0mnn 带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7) \xhh 带有十六进制值 0x 的字符 hh \uhhhh 带有十六进制值 0x 的字符 hhhh \t 制表符 ('\u0009') \n 新行(换行)符 ('\u000A') \r 回车符 ('\u000D') \f 换页符 ('\u000C') \a 报警 (bell) 符 ('\u0007') \e 转义符 ('\u001B') \cx 对应于 x 的控制符
2.Matcher.find():尝试查找与模式匹配的字符序列的下一个子序列。此方法从字符序列的开头开始,如果该方法的前一次调用成功了并且从那时开始匹配器没有被重置,则从以前匹配操作没有匹配的第一个字符开始,即如果前一次找到与模式匹配的子序列则这次从这个子序列后开始查找。
3.Matcher.matchers():判断整个字符序列与模式是否匹配。当连续用Matcher对象检查多个字符串时候,可以使用Matcher.reset()重置匹配器,放弃其所有显式状态信息并将其添加位置设置为零,或者Matcher.reset(CharSequence input)重置此具有新输入序列的匹配器,来重复使用匹配器。
4.组的概念,这个概念很重要,组是用括号划分的正则表达式,可以通过编号来引用组。组号从0开始,有几对小括号就表示有几个组,并且组可以嵌套,组号为0的表示整个表达式,组号为1的表示第一个组,依此类推。
例如:
A(B)C(D)E正则式中有三组,组0是ABCDE,组1是B,组2是D;
A((B)C)(D)E正则式中有四组:组0是ABCDE,组1是BC,组2是B;组3是C,组4是D。
int groupCount():返回匹配其模式中组的数目,不包括第0组。
String group():返回前一次匹配操作(如find())的第0组。
String group(int group):返回前一次匹配操作期间指定的组所匹配的子序列。如果该匹配成功,但指定组未能匹配字符序列的任何部分,则返回 null。
int start(int group):返回前一次匹配操作期间指定的组所匹配的子序列的初始索引。
int end(int group):返回前一次匹配操作期间指定的组所匹配的子序列的最后索引+1。
5.匹配的范围的控制
最变态的就要算lookingAt()方法了,名字很让人迷惑,需要认真看APIDoc。
start()返回以前匹配的初始索引。
end()返回最后匹配字符之后的偏移量。
public boolean lookingAt()尝试将从区域开头开始的输入序列与该模式匹配。与matches 方法类似,此方法始终从区域的开头开始;与之不同的是,它不需要匹配整个区域。如果匹配成功,则可以通过start、end和group方法获取更多信息;当且仅当输入序列的前缀匹配此匹配器的模式时才返回true。
6.Pattern标记
Pattern类的静态方法:
static Pattern compile(String regex, int flags):将给定的正则表达式编译到具有给定标志的模式中,其中的flags参数就是Pattern标记,这个标记在某些时候非常重要。
Pattern.CANON_EQ:启用规范等价。
Pattern.CASE_INSENSITIVE:启用不区分大小写的匹配。
Pattern.COMMENTS:模式中允许空白和注释。
Pattern.DOTALL:启用 dotall 模式。
Pattern.LITERAL:启用模式的字面值分析。
Pattern.MULTILINE:启用多行模式。
Pattern.UNICODE_CASE:启用 Unicode 感知的大小写折叠。
Pattern.UNIX_LINES:启用 Unix 行模式。
三.字符串的替换
String.replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 而生成的。
String.replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串匹配字面值目标序列的每个子字符串。
String.replaceAll(String regex, String replacement):使用给定的 replacement 字符串替换此字符串匹配给定的正则表达式的每个子字符串。
String.replaceFirst(String regex, String replacement):使用给定的 replacement 字符串替换此字符串匹配给定的正则表达式的第一个子字符串。
StringBuffer.replace(int start, int end, String str):使用给定 String 中的字符替换此序列的子字符串中的字符。
StringBuilder.replace(int, int, java.lang.String):使用给定 String 中的字符替换此序列的子字符串中的字符。
Matcher.replaceAll(String replacement):替换模式与给定替换字符串相匹配的输入序列的每个子序列。
Matcher.replaceFirst(String replacement):替换模式与给定替换字符串匹配的输入序列的第一个子序列。
四.字符串的切分
String[] split(String regex):根据给定的正则表达式的匹配来拆分此字符串。
String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此字符串。
当然,还有一个StringTokenizer类,可以用来切分字符串,但是现在SUN已经不推荐使用了。转变下思路,其实用正则表达式也可以达到将字符串切分为段的目的。
五.没有提到的
正则表达式的API简单好用,没太多复杂的地方,并非不重要,正则表达式最大的难点在于熟练书写正则表达式。
有关正则表达式的规范,在Pattern类APIdoc中都有非常详细的介绍,而且条理清晰,在此就不赘述了。
相关推荐
本文写作时,一个包含了用正则表达式进行文本处理的Java规范需求(Specification Request)已经得到认可,你可以期待在JDK的下一版本中看到它。 然而,如果现在就需要使用正则表达式,又该怎么办呢?你可以从Apache...
java,正则表达式,详解,java正则表达式,PDF
Java正则表达式 Java 正则表达式 图片版 携带方便,查阅方便!~
JAVA正则表达式应用:任意输入一串字符串 如何输入exit退出程序;从输入的字符串中判断是否包含手机号码 正则表达式可以使用" +86| 86 1 d{10}" 如果包含请将其在控制台打印出来 否则输出不包含字符串 ...
Java正则表达式Java正则表达式Java正则表达式Java正则表达式
java正则表达式验证IP地址
正则表达式之道.doc 正则表达式中的特殊字符.doc Java正则表达式详解.doc 正则表达式.ppt JAVA正则表达式--Pattern和Matcher.doc 例子
Java正则表达式应用总结
Java正则表达式详解
java正则表达式.pdfjava正则表达式.pdfjava正则表达式.pdfjava正则表达式.pdfjava正则表达式.pdf
java正则表达式使用例子,代码是Android的
Java正则表达式详解
正则表达式的使用 java正则表达式的使用示例 java正则表达式
java正则表达式详细全面讲解描述
一篇学习Java正则表达式的文章。
Java正则表达式入门介绍课件;Java正则表达式入门介绍课件
网络上搜集到的java正则表达式编程,整理了下做成了PDF格式
java正则表达式使用.docx 资源
Java正则表达式入门介绍.ppt,介绍常用语法规则及使用方式等