正则表达式定义了字符串的模式。正则表达式可以用来搜索、编辑或处理文本。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。Java正则表达式和Perl的是最为相似的。

Java正则表达式的类在java.util.regex包中,包括三个类:Pattern,Matcher和PatternSyntaxException。
我们今天就来说说PatternSyntaxException:

PatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误。

以下实例中使用了正则表达式.*runoob.*用于查找字符串中是否包含了runoob子串:

package cc.bcy;

import java.util.regex.*;

public class RegexExample
{
    public static void main(String[] args)
    {
        String content="I am noob from runoob.com";
        String pattern=".*runoob.*";
        boolean isMatch=Pattern.matches(pattern, content);
        System.out.println("字符串中是否包含了‘runoob’子字符串?"+isMatch);
    }
}
/*
字符串中是否包含了‘runoob’子字符串?true
*/

捕获组:

捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。可以通过调用matcher对象的groupCount方法来查看表达式有多少个分组。groupCount方法返回一个int值,表示matcher对象当前有多个捕获组。

还有一个特殊的组(group(0)),它总是代表整个表达式。该组不包括在groupCount的返回值中。

package cc.bcy;

import java.util.regex.*;

public class RegexExample
{
    public static void main(String[] args)
    {
        String line="This order was placed for QT3000! OK?";
        String pattern="(\\D*)(\\d+)(.*)";
        //创建Pattern对象
        Pattern p=Pattern.compile(pattern);
        //创建Matcher对象
        Matcher m=p.matcher(line);
        if(m.find())
        {
            System.out.println("Found value: "+m.group(0));
            System.out.println("Found value: "+m.group(1));
            System.out.println("Found value: "+m.group(2));
            System.out.println("Found value: "+m.group(3));
        }
        else
        {
            System.out.println("No Match!");
        }
        int n=m.groupCount();
        System.out.println("一共有"+n+"个捕获组");
    }
}
/*
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT
Found value: 3000
Found value: ! OK?
一共有3个捕获组
*/

Java正则表达式语法:

在其他语言中,\表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。

在Java中,\表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。

所以,在其他的语言中(如Perl),一个反斜杠就足以具有转义的作用,而在Java中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在Java的正则表达式中,两个\代表其他语言中的一个,这也就是为什么表示一位数字的正则表达式是\d,而表示一个普通的反斜杠是\。