Java的Regex中的Pattern Class (1)

阅读时间: 10分钟

Regular expression(简称Regex) 在解析及验证的时候是最花时间的,在经常使用某规则运算式(简称Regex)的情况下,会导致系统的效率降低。

java.util.regex.Pattern 是其中一个主要连接Regular expression的API。
而Pattern Class 可以改善效率的问题。

使用Pattern Class有两种方式。
分别是
Pattern.matches()
用作快速配对在String上。
Pattern.compile()
用作快速配对在String上,可以重複多次使用在不同的text上。

Pattern 的建构式被标示为 private,无法用 new 建构 Pattern 实例,必须透过 Pattern 的静态方法 compile 来建构,在解析及验证过规则运算式之后,将会传回 Pattern 实例,之后就可以重複使用这个实例。

例子:
Pattern.matches(), 会返回true假如s包含3个字母(letter)

public boolean isThreeLetters(String s){        return s.matches("[a-zA-Z]{3}");// simpler from for// return s.matches("[a-Z][a-Z][a-Z]");

Pattern.compile(), 验证Regex是不是在actualString中

import java.util.regex.*; public class compileCase{     public static void main(String[] args)     {         //首先创建一个Regex         String REGEX = ".*www.*";           // 创建一个String, 会被用于搜寻的text        String actualString             = "www.uppengarden.com";           // 使用compile() method         Pattern pattern = Pattern.compile(REGEX);           // 创建一个 matcher物件         Matcher matcher = pattern.matcher(actualString);           // 验证REGEX是否在actualString中        boolean matches = matcher.matches();           System.out.println("actualString "                           + "contains REGEX = "                           + matches);     } }

重点 1:

在使用Pattern.compile()时,可以有其他方式。
正常的形式是:

Pattern pattern = Pattern.compile(REGEX);// REGEX 是String, String REGEX = ".*uppengarden.*";

或者

Pattern pattern = Pattern.compile(".*uppengarden");

另一形式是可以指定旗标
例如想不分大小写比对 uppengarden文字,可以这样做,如下:

Pattern pattern = Pattern.compile("uppengarden", Pattern.CASE_INSENSITIVE);

重点 2:

旗标的形式有两种,
除了正常的旗标表示法,可使用嵌入旗标表示法(Embedded Flag Expression)。Pattern.CASE_INSENSITIVE的嵌入旗标表示法为 (?i)

Pattern pattern = Pattern.compile("(?i)uppengarden");

若想对特定分组嵌入旗标,可以使用 (?i:uppengarden) 这样的语法,以下是能使用的语法:

Pattern.CASE_INSENSITIVE:(?i)
Pattern.COMMENTS:(?x)
Pattern.MULTILINE:(?m)
Pattern.DOTALL:(?s)
Pattern.UNICODE_CASE:(?u)
Pattern.UNICODE_CHARACTER_CLASS:(?U)
Pattern.UNIX_LINES:(?d)
Pattern.CANON_EQ 与 Pattern.LITERAL 没有对应的嵌入式表示法。Pattern.CANON_EQ 会启用 Canonical equivalence,简单来说,像 å 字元(U+00E5),也会使用 a 与 ̊ 组合标示(combining mark)(U+030A)来表示,对 Pattern 来说,预设两个是不等价的,然而启用了 Pattern.CANON_EQ,两者会视为相同


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章