Pattern.java revision 0510f0d8ce7c20b8f6022545a70e8b868805dc60
1fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project/* 2fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * 4fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * you may not use this file except in compliance with the License. 6fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * You may obtain a copy of the License at 7fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * 8fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * 10fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * See the License for the specific language governing permissions and 14fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * limitations under the License. 15fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project */ 16fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 17fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Projectpackage java.util.regex; 18fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 19fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Projectimport java.io.Serializable; 20fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Projectimport java.util.ArrayList; 21fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Projectimport com.ibm.icu4jni.regex.NativeRegEx; 22fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 23fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project/** 24fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * Represents a pattern used for matching, searching, or replacing strings. 25fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * {@code Pattern}s are specified in terms of regular expressions and compiled 26fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * using an instance of this class. They are then used in conjunction with a 27fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * {@link Matcher} to perform the actual search. 28fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * <p/> 29fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * A typical use case looks like this: 30fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * <p/> 31fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * <pre> 32fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * Pattern p = Pattern.compile("Hello, A[a-z]*!"); 33fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * 34fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * Matcher m = p.matcher("Hello, Android!"); 35fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * boolean b1 = m.matches(); // true 36fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * 37fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * m.setInput("Hello, Robot!"); 38fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * boolean b2 = m.matches(); // false 39fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * </pre> 40fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * <p/> 41fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * The above code could also be written in a more compact fashion, though this 42fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * variant is less efficient, since {@code Pattern} and {@code Matcher} objects 43fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * are created on the fly instead of being reused. 44fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * fashion: 45fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * <pre> 46fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * boolean b1 = Pattern.matches("Hello, A[a-z]*!", "Hello, Android!"); // true 47fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * boolean b2 = Pattern.matches("Hello, A[a-z]*!", "Hello, Robot!"); // false 48fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * </pre> 49fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * <p/> 50b138bc23f31ff41dfb5a1cf825b631f0a15594acScott Main * Please consult the <a href="package-descr.html">package documentation</a> for an 51fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * overview of the regular expression syntax used in this class as well as 52fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * Android-specific implementation details. 53fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * 54fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @see Matcher 55fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project */ 56fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Projectpublic final class Pattern implements Serializable { 57fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 58fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project private static final long serialVersionUID = 5073258162644648461L; 59fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 60fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project /** 61fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * This constant specifies that a pattern matches Unix line endings ('\n') 62fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * only against the '.', '^', and '$' meta characters. 63fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project */ 64fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project public static final int UNIX_LINES = 0x01; 65fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 66fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project /** 67fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * This constant specifies that a {@code Pattern} is matched 68fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * case-insensitively. That is, the patterns "a+" and "A+" would both match 69fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * the string "aAaAaA". 70fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * <p> 71fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * Note: For Android, the {@code CASE_INSENSITIVE} constant 72fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * (currently) always includes the meaning of the {@link #UNICODE_CASE} 73fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * constant. So if case insensitivity is enabled, this automatically extends 74fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * to all Unicode characters. The {@code UNICODE_CASE} constant itself has 75fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * no special consequences. 76fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project */ 77fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project public static final int CASE_INSENSITIVE = 0x02; 78fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 79fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project /** 80fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * This constant specifies that a {@code Pattern} may contain whitespace or 81fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * comments. Otherwise comments and whitespace are taken as literal 82fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * characters. 83fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project */ 84fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project public static final int COMMENTS = 0x04; 85fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 86fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project /** 87fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * This constant specifies that the meta characters '^' and '$' match only 88fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * the beginning and end end of an input line, respectively. Normally, they 89fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * match the beginning and the end of the complete input. 90fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project */ 91fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project public static final int MULTILINE = 0x08; 92fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 93fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project /** 94fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * This constant specifies that the whole {@code Pattern} is to be taken 95fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * literally, that is, all meta characters lose their meanings. 96fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project */ 97fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project public static final int LITERAL = 0x10; 98fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 99fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project /** 100fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * This constant specifies that the '.' meta character matches arbitrary 101fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * characters, including line endings, which is normally not the case. 102fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project */ 103fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project public static final int DOTALL = 0x20; 104fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 105fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project /** 106fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * This constant specifies that a {@code Pattern} is matched 107fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * case-insensitively with regard to all Unicode characters. It is used in 108fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * conjunction with the {@link #CASE_INSENSITIVE} constant to extend its 109fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * meaning to all Unicode characters. 110fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * <p> 111fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * Note: For Android, the {@code CASE_INSENSITIVE} constant 112fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * (currently) always includes the meaning of the {@code UNICODE_CASE} 113fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * constant. So if case insensitivity is enabled, this automatically extends 114fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * to all Unicode characters. The {@code UNICODE_CASE} constant then has no 115fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * special consequences. 116fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project */ 117fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project public static final int UNICODE_CASE = 0x40; 118fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 119fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project /** 120fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * This constant specifies that a character in a {@code Pattern} and a 121fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * character in the input string only match if they are canonically 122fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * equivalent. It is (currently) not supported in Android. 123fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project */ 124fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project public static final int CANON_EQ = 0x80; 125fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 126fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project /** 127fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * Holds the regular expression. 128fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project */ 129fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project private String pattern; 130fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 131fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project /** 132fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * Holds the flags used when compiling this pattern. 133fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project */ 134fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project private int flags; 135fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 136fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project /** 137fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * Holds a handle (a pointer, actually) for the native ICU pattern. 138fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project */ 139fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project transient int mNativePattern; 140fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 141fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project /** 142fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * Holds the number of groups in the pattern. 143fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project */ 144fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project transient int mGroupCount; 14577d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson 14677d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson 147fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project /** 14877d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * Returns a {@link Matcher} for the {@code Pattern} and a given input. The 14977d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * {@code Matcher} can be used to match the {@code Pattern} against the 15077d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * whole input, find occurrences of the {@code Pattern} in the input, or 15177d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * replace parts of the input. 15277d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * 15377d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * @param input 15477d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * the input to process. 15577d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * 15677d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * @return the resulting {@code Matcher}. 157fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project */ 15877d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson public Matcher matcher(CharSequence input) { 15977d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson return new Matcher(this, input); 16077d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson } 16177d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson 16277d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson /** 16377d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * Splits the given input sequence at occurrences of this {@code Pattern}. 16477d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * 16577d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * <p>If this {@code Pattern} does not occur in the input, the result is an 16677d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * array containing the input (converted from a {@code CharSequence} to 16777d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * a {@code String}). 16877d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * 16977d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * <p>Otherwise, the {@code limit} parameter controls the contents of the 17077d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * returned array as described below. 17177d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * 17277d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * @param limit 17377d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * Determines the maximum number of entries in the resulting 17477d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * array, and the treatment of trailing empty strings. 17577d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * <ul> 17677d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * <li>For n > 0, the resulting array contains at most n 17777d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * entries. If this is fewer than the number of matches, the 17877d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * final entry will contain all remaining input. 17977d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * <li>For n < 0, the length of the resulting array is 18077d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * exactly the number of occurrences of the {@code Pattern} 18177d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * plus one for the text after the final separator. 18277d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * All entries are included. 18377d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * <li>For n == 0, the result is as for n < 0, except 18477d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * trailing empty strings will not be returned. (Note that 18577d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * the case where the input is itself an empty string is 18677d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * special, as described above, and the limit parameter does 18777d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * not apply there.) 18877d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * </ul> 18977d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson */ 1900510f0d8ce7c20b8f6022545a70e8b868805dc60Elliott Hughes public String[] split(CharSequence input, int limit) { 1910510f0d8ce7c20b8f6022545a70e8b868805dc60Elliott Hughes return Splitter.split(this, pattern, input.toString(), limit); 19277d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson } 19377d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson 19477d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson /** 19577d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * Splits a given input around occurrences of a regular expression. This is 19677d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * a convenience method that is equivalent to calling the method 19777d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * {@link #split(java.lang.CharSequence, int)} with a limit of 0. 19877d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson */ 19977d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson public String[] split(CharSequence input) { 20077d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson return split(input, 0); 20177d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson } 20277d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson 20377d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson /** 20477d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * Returns the regular expression that was compiled into this 20577d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * {@code Pattern}. 20677d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * 20777d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * @return the regular expression. 20877d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson */ 20977d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson public String pattern() { 21077d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson return pattern; 21177d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson } 21277d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson 21377d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson @Override 21477d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson public String toString() { 21577d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson return pattern; 21677d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson } 21777d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson 21877d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson /** 21977d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * Returns the flags that have been set for this {@code Pattern}. 22077d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * 22177d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * @return the flags that have been set. A combination of the constants 22277d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * defined in this class. 22377d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * 22477d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * @see #CANON_EQ 22577d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * @see #CASE_INSENSITIVE 22677d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * @see #COMMENTS 22777d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * @see #DOTALL 22877d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * @see #LITERAL 22977d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * @see #MULTILINE 23077d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * @see #UNICODE_CASE 23177d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * @see #UNIX_LINES 23277d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson */ 23377d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson public int flags() { 23477d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson return flags; 235fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project } 236fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 237fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project /** 238fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * Compiles a regular expression, creating a new {@code Pattern} instance in 239fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * the process. Allows to set some flags that modify the behavior of the 240fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * {@code Pattern}. 241fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * 242fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @param pattern 243fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * the regular expression. 244fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @param flags 245fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * the flags to set. Basically, any combination of the constants 246fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * defined in this class is valid. 247fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * <p> 248fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * Note: Currently, the {@link #CASE_INSENSITIVE} and 249fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * {@link #UNICODE_CASE} constants have slightly special behavior 250fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * in Android, and the {@link #CANON_EQ} constant is not 251fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * supported at all. 252fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * 253fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @return the new {@code Pattern} instance. 254fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * 255fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @throws PatternSyntaxException 256fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * if the regular expression is syntactically incorrect. 257fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * 258fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @see #CANON_EQ 259fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @see #CASE_INSENSITIVE 260fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @see #COMMENTS 261fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @see #DOTALL 262fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @see #LITERAL 263fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @see #MULTILINE 264fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @see #UNICODE_CASE 265fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @see #UNIX_LINES 266fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project */ 267fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project public static Pattern compile(String pattern, int flags) throws PatternSyntaxException { 268fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project return new Pattern(pattern, flags); 269fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project } 270fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 271fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project /** 272fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * Creates a new {@code Pattern} instance from a given regular expression 273fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * and flags. 274fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * 275fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @param pattern 276fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * the regular expression. 277fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @param flags 278fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * the flags to set. Any combination of the constants defined in 279fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * this class is valid. 280fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * 281fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @throws PatternSyntaxException 282fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * if the regular expression is syntactically incorrect. 283fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project */ 284fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project private Pattern(String pattern, int flags) throws PatternSyntaxException { 285fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project if ((flags & CANON_EQ) != 0) { 286fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project throw new UnsupportedOperationException("CANON_EQ flag not supported"); 287fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project } 288fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 289fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project this.pattern = pattern; 290fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project this.flags = flags; 291fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 292fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project compileImpl(pattern, flags); 293fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project } 29477d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson 29577d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson /** 29677d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * Compiles a regular expression, creating a new Pattern instance in the 29777d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * process. This is actually a convenience method that calls {@link 29877d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * #compile(String, int)} with a {@code flags} value of zero. 29977d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * 30077d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * @param pattern 30177d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * the regular expression. 30277d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * 30377d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * @return the new {@code Pattern} instance. 30477d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * 30577d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * @throws PatternSyntaxException 30677d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * if the regular expression is syntactically incorrect. 30777d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson */ 30877d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson public static Pattern compile(String pattern) { 30977d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson return new Pattern(pattern, 0); 31077d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson } 31177d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson 312fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project /** 313fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * Compiles the given regular expression using the given flags. Used 314fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * internally only. 315fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * 316fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @param pattern 317fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * the regular expression. 318fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @param flags 319fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * the flags. 320fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project */ 321fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project private void compileImpl(String pattern, int flags) throws PatternSyntaxException { 322fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project if (pattern == null) { 323fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project throw new NullPointerException(); 324fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project } 325fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 326fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project if ((flags & LITERAL) != 0) { 327fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project pattern = quote(pattern); 328fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project } 329fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 330fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project // These are the flags natively supported by ICU. 331fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project // They even have the same value in native code. 332fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project flags = flags & (CASE_INSENSITIVE | COMMENTS | MULTILINE | DOTALL | UNIX_LINES); 333fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 334fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project mNativePattern = NativeRegEx.open(pattern, flags); 335fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project mGroupCount = NativeRegEx.groupCount(mNativePattern); 336fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project } 337fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 338fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project /** 339fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * Tries to match a given regular expression against a given input. This is 340fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * actually nothing but a convenience method that compiles the regular 341fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * expression into a {@code Pattern}, builds a {@link Matcher} for it, and 342fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * then does the match. If the same regular expression is used for multiple 343fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * operations, it is recommended to compile it into a {@code Pattern} 344fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * explicitly and request a reusable {@code Matcher}. 345fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * 346fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @param regex 347fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * the regular expression. 348fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @param input 349fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * the input to process. 350fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * 351fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @return true if and only if the {@code Pattern} matches the input. 352fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * 353fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @see Pattern#compile(java.lang.String, int) 354fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @see Matcher#matches() 355fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project */ 35677d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson public static boolean matches(String regex, CharSequence input) { 357fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project return new Matcher(new Pattern(regex, 0), input).matches(); 358fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project } 359fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 360fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project /** 361fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * Quotes a given string using "\Q" and "\E", so that all other 362fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * meta-characters lose their special meaning. If the string is used for a 363fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * {@code Pattern} afterwards, it can only be matched literally. 364fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * 365fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @param s 366fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * the string to quote. 367fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * 368fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project * @return the quoted string. 369fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project */ 370fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project public static String quote(String s) { 37177d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson StringBuilder sb = new StringBuilder().append("\\Q"); //$NON-NLS-1$ 372fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project int apos = 0; 373fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project int k; 37477d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson while ((k = s.indexOf("\\E", apos)) >= 0) { //$NON-NLS-1$ 37577d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson sb.append(s.substring(apos, k + 2)).append("\\\\E\\Q"); //$NON-NLS-1$ 376fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project apos = k + 2; 377fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project } 378fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 37977d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson return sb.append(s.substring(apos)).append("\\E").toString(); //$NON-NLS-1$ 380fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project } 381fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 382fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project @Override 383dd828f42a5c83b4270d4fbf6fce2da1878f1e84aThe Android Open Source Project protected void finalize() throws Throwable { 384dd828f42a5c83b4270d4fbf6fce2da1878f1e84aThe Android Open Source Project try { 385dd828f42a5c83b4270d4fbf6fce2da1878f1e84aThe Android Open Source Project if (mNativePattern != 0) { 386dd828f42a5c83b4270d4fbf6fce2da1878f1e84aThe Android Open Source Project NativeRegEx.close(mNativePattern); 387dd828f42a5c83b4270d4fbf6fce2da1878f1e84aThe Android Open Source Project } 388dd828f42a5c83b4270d4fbf6fce2da1878f1e84aThe Android Open Source Project } 389dd828f42a5c83b4270d4fbf6fce2da1878f1e84aThe Android Open Source Project finally { 390dd828f42a5c83b4270d4fbf6fce2da1878f1e84aThe Android Open Source Project super.finalize(); 391fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project } 392fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project } 393fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 394fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project /** 39577d58e2a1577a4992f4d81e9ca2807f7533725c6Jesse Wilson * Serialization support 396fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project */ 397fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project private void readObject(java.io.ObjectInputStream s) 398fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project throws java.io.IOException, ClassNotFoundException { 399fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project s.defaultReadObject(); 400fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 401fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project compileImpl(pattern, flags); 402fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project } 403fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project 404fdb2704414a9ed92394ada0d1395e4db8688946The Android Open Source Project} 405