阅读时间: 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,两者会视为相同