ThePattern.compile Factory
正则表达式的Pattern对象是通过Pattern.compile生成的。第一个参数是代表正则表达式的字符串(☞101)。368页表格8-3中的选项可以作为第二个参数。下面的代码从字符串myRegex生成一个pattern,进行不区分大小写的匹配:
预定义的 pattern 常量用来指定编译选项(例如 Pattern.CASE_INSENSITIVE),这可能有点笨拙(注2),所以我会使用正则表达式内部的模式修饰符(☞110)。包括378页的「(?x)」,399页的「(?s)」和多个「(?i)」。
不过,预定义常量固然复杂,但这种“笨办法(unwieldy)”能够降低新手阅读代码的难度。如果没有页面宽度限制,我们可以这样写第384页的Pattern.compile的第二个参数:
Pattern.UNIX_LINES|Pattern.CASE_INSENSITIVE
而不是在正则表达式开头使用不那么清楚的「(?id)」。
从名字可以看出,这一步把正则表达式解析并编译为内部形式。第 6 章对此有详细讲解(☞241),简单地说,在字符串内应用表达式的整个过程中,编译pattern 通常是最耗时间的。所以要把编译独立出来,作为第一步——这样就可以先期将正则表达式编译好,重复使用。
当然,如果正则表达式编译之后只需要使用一次,编译时机就不是个问题,但如果需要多次应用(例如应用到读入文件的每一行),预编译Pattern对象就很有价值。
调用Patern.compile可能抛出两种类型的异常:如果正则表达式不合规则,抛出Pattern-SyntaxException,选项不合规则,抛出IllegalArgumentException。
Pattern的matcher方法
Pattern's matchermethod
下一节(☞394)我们会看到,Pattern提供了某些简便的方法,但是大多数情况下,我们只需要一个方法完成所有工作:matcher。它接受一个参数:需要检索的字符串(注 3)。此时并没有确切应用这个正则表达式,而只是为将 pattern应用到特定的字符串做准备。matcher方法返回一个Matcher对象。