前言
大家都知道在linux shell、perl、python等脚本语言中正本表达式是非常强大的,几乎没有什么事它不能表达的。对于学java的程序员来说,sun退出的java.util.regex这个包也是很强大,下面我来一步步地向大家介绍Java中正则表达式的使用;
基本类
Java正则表达式使用到的类主要是3个(不是很多吧!),这两个的功能如下:
(1)Pattern类:是用来表达和陈述所要搜索模式的对象
(2)Matcher类:是真正影响搜索的对象
(3)PatternSyntaxException类:当遇到不合法的搜索模式时,会抛出例外
代码实例
在接下来的几节,我都会通过一个个的代码实例来一点点介绍Java正则表达式的使用,由复杂到简单,让大家逐步掌握Java正则表达式。
Test1.java
public class Test1 {
public static void main(String[] args) {
String str = "(222)-123";
String regEx = "\\(222\\)";
Pattern pat = Pattern.compile(regEx);
Matcher mat = pat.matcher(str);
if(mat.find())
System.out.println(mat.group());
else
System.out.println("Not find");
}
}
这个程序是在(222)-123这个字符串中查找匹配"(222)",如果存在会输出匹配的字符串,否则输出"Not find";
String regEx = "\\(222\\)";这段代码之所以使用两个反斜线符号“\\”,是因为在java中,与regex有关的包,并不都能理解和识别反斜线字符\,
为避免这一点,即为了让反斜线字符\在模式对象中被完全地传递,应该用双反斜线字符”\\“。这里,如果要表示一个“字面上的(”圆符号,就要使用“\\”。大家也可以试试String regEx = "(222)"这个匹配模式,输出结果是“222”,就也是说这是圆符号不是作为一个字面上的字符,而是表示222作为一个整体来看待的意思。如果说要匹配“(222”,如果这时使用String regEx = "(222"是会报错的。必须使用String regEx = "\\(222)"。
为避免这一点,即为了让反斜线字符\在模式对象中被完全地传递,应该用双反斜线字符”\\“。这里,如果要表示一个“字面上的(”圆符号,就要使用“\\”。大家也可以试试String regEx = "(222)"这个匹配模式,输出结果是“222”,就也是说这是圆符号不是作为一个字面上的字符,而是表示222作为一个整体来看待的意思。如果说要匹配“(222”,如果这时使用String regEx = "(222"是会报错的。必须使用String regEx = "\\(222)"。
同样的上面String regEx = "\\(222\\)";还可以表示为:
String regEx = "\\(2{3}\\)";
这里{3}
表示重复符,表示{3}的前一个字符重复出现3次,则2{3}就表示"222"。有于我们匹配的是(整数),那么还可以使用下面的方式:
String regEx = "\\(\\d\\d\\d\\)";
这里"\d"表示从0-9其中一个数字
如果说要匹配"(222)-123"整个字符串,可以使用下面这个表达式:
String regEx = "\\(\\d{3}\\)+-+(\\d{3})";
这里和大家介绍一个“+”符号,这个符号表示连接的意思,就像String字符串中的“+”一样,连接两个字符串。其实上面的表达式等同于:
String regEx = "\\(\\d{3}\\)-(\\d{3})";
总结
(1)k{n},表示n个k
(2)\d,表示0-9中的一个数字
(3)\\(\\),表示圆括号“()”
(4)+,表示连接两个表达式