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 &gt; 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 &lt; 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 &lt; 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