10647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson/*
20647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson * Copyright (C) 2008 The Android Open Source Project
30647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson *
40647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
50647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson * you may not use this file except in compliance with the License.
60647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson * You may obtain a copy of the License at
70647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson *
80647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson *      http://www.apache.org/licenses/LICENSE-2.0
90647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson *
100647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson * Unless required by applicable law or agreed to in writing, software
110647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
120647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson * See the License for the specific language governing permissions and
140647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson * limitations under the License.
150647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson */
160647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
170647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilsonpackage libcore.java.util.regex;
180647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
190647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilsonimport java.util.regex.Matcher;
200647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilsonimport java.util.regex.Pattern;
210647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilsonimport junit.framework.TestCase;
220647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
230647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilsonpublic final class OldAndroidRegexTest extends TestCase {
240647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    public void testMatches() throws Exception {
250647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        /* Tests class Matcher */
260647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
270647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        Pattern p = Pattern.compile("bcd");
280647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        Matcher m = p.matcher("bcd");
290647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertTrue("Should match.", m.matches());
300647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
310647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        /* Pattern in the middle */
320647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        p = Pattern.compile("bcd");
330647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        m = p.matcher("abcdefg");
340647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertFalse("Should not match.", m.matches());
350647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
360647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        /* Pattern at the head */
370647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        m = p.matcher("bcdefg");
380647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertFalse("Should not match.", m.matches());
390647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
400647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        /* Pattern at the tail */
410647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        m = p.matcher("abcd");
420647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertFalse("Should not match.", m.matches());
430647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
440647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        /* Make sure matches() doesn't change after calls to find() */
450647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        p = Pattern.compile(".*");
460647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        m = p.matcher("abc");
470647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertTrue(m.matches());
480647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertTrue(m.find());
490647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertTrue(m.matches());
500647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
510647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        p = Pattern.compile(".");
520647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        m = p.matcher("abc");
530647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertFalse(m.matches());
540647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertTrue(m.find());
550647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertFalse(m.matches());
560647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
570647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        /* Make sure matches() agrees after a reset() */
580647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        m.reset("z");
590647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertTrue(m.matches());
600647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
610647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        m.reset("xyz");
620647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertFalse(m.matches());
630647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
640647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        /* Tests class Pattern */
650647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
660647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertFalse("Erroneously matched partial string.  " +
670647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson                "See http://b/issue?id=754601", Pattern.matches("er", "xer"));
680647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertFalse("Erroneously matched partial string.  " +
690647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson                "See http://b/issue?id=754601", Pattern.matches("xe", "xer"));
700647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertTrue("Generic regex should match.",
710647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson                Pattern.matches(".*", "bcd"));
720647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertTrue("Grouped regex should match.",
730647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson                Pattern.matches("(b(c(d)))", "bcd"));
740647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertTrue("Grouped regex should match.",
750647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson                Pattern.matches("(b)(c)(d)", "bcd"));
760647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    }
770647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
780647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    public void testGroupCount() throws Exception {
790647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        Pattern p = Pattern.compile(
800647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson                "\\b(?:\\+?1)?"
810647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson                        + "(?:[ -\\.])?"
820647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson                        + "\\(?(\\d{3})?\\)?"
830647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson                        + "(?:[ -\\.\\/])?"
840647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson                        + "(\\d{3})"
850647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson                        + "(?:[ -\\.])?"
860647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson                        + "(\\d{4})\\b"
870647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        );
880647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
890647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        Matcher m = p.matcher("1 (919) 555-1212");
900647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
910647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("groupCount is incorrect, see http://b/issue?id=759412",
920647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson                3, m.groupCount());
930647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    }
940647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
950647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    public void testGroups() throws Exception {
960647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        Pattern p = Pattern.compile("(b)([c|d])(z*)");
970647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        Matcher m = p.matcher("abcdefg");
980647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
990647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        /* Must call find() first, otherwise group*() are undefined. */
1000647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertTrue(m.find());
1010647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1020647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals(3, m.groupCount());
1030647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1040647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("bc", m.group(0));
1050647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("b", m.group(1));
1060647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("c", m.group(2));
1070647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("", m.group(3));
1080647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    }
1090647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1100647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    public void testFind() throws Exception {
1110647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        Pattern p = Pattern.compile(".");
1120647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        Matcher m = p.matcher("abc");
1130647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1140647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertTrue(m.find());
1150647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("a", m.group(0));
1160647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1170647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertTrue(m.find());
1180647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("b", m.group(0));
1190647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1200647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertTrue(m.find());
1210647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("c", m.group(0));
1220647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1230647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertFalse(m.find());
1240647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    }
1250647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1260647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    public void testReplaceAll() throws Exception {
1270647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        // Begins with non-matching text, ends with matching text
1280647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        Pattern p = Pattern.compile("a*b");
1290647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        Matcher m = p.matcher("fooaabfooaabfooabfoob");
1300647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1310647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        String r = m.replaceAll("-");
1320647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("foo-foo-foo-foo-", r);
1330647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1340647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        // Begins with matching text, ends with non-matching text
1350647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        p = Pattern.compile("a*b");
1360647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        m = p.matcher("aabfooaabfooabfoobfoo");
1370647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1380647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        r = m.replaceAll("-");
1390647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("-foo-foo-foo-foo", r);
1400647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    }
1410647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1420647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    public void testReplaceFirst() throws Exception {
1430647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        // Begins with non-matching text, ends with matching text
1440647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        Pattern p = Pattern.compile("a*b");
1450647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        Matcher m = p.matcher("fooaabfooaabfooabfoob");
1460647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1470647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        String r = m.replaceFirst("-");
1480647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("foo-fooaabfooabfoob", r);
1490647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1500647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        // Begins with matching text, ends with non-matching text
1510647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        p = Pattern.compile("a*b");
1520647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        m = p.matcher("aabfooaabfooabfoobfoo");
1530647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1540647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        r = m.replaceFirst("-");
1550647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("-fooaabfooabfoobfoo", r);
1560647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    }
1570647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1580647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    public void testSplit() throws Exception {
1590647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        Pattern p = Pattern.compile(":");
1600647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        String[] strings;
1610647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1620647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        strings = p.split("boo:and:foo");
1630647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals(3, strings.length);
1640647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("boo", strings[0]);
1650647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("and", strings[1]);
1660647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("foo", strings[2]);
1670647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1680647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        strings = p.split("boo:and:foo", 2);
1690647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals(2, strings.length);
1700647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("boo", strings[0]);
1710647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("and:foo", strings[1]);
1720647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1730647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        strings = p.split("boo:and:foo", 5);
1740647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals(3, strings.length);
1750647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("boo", strings[0]);
1760647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("and", strings[1]);
1770647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("foo", strings[2]);
1780647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1790647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        strings = p.split("boo:and:foo", -2);
1800647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals(3, strings.length);
1810647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("boo", strings[0]);
1820647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("and", strings[1]);
1830647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("foo", strings[2]);
1840647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1850647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        p = Pattern.compile("o");
1860647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1870647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        strings = p.split("boo:and:foo");
1880647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals(3, strings.length);
1890647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("b", strings[0]);
1900647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("", strings[1]);
1910647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals(":and:f", strings[2]);
1920647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
1930647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        strings = p.split("boo:and:foo", 5);
1940647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals(5, strings.length);
1950647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("b", strings[0]);
1960647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("", strings[1]);
1970647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals(":and:f", strings[2]);
1980647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("", strings[3]);
1990647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("", strings[4]);
2000647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
2010647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        strings = p.split("boo:and:foo", -2);
2020647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals(5, strings.length);
2030647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("b", strings[0]);
2040647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("", strings[1]);
2050647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals(":and:f", strings[2]);
2060647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("", strings[3]);
2070647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("", strings[4]);
2080647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
2090647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        strings = p.split("boo:and:foo", 0);
2100647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals(3, strings.length);
2110647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("b", strings[0]);
2120647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals("", strings[1]);
2130647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertEquals(":and:f", strings[2]);
2140647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    }
2150647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
2160647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    // -------------------------------------------------------------------
2170647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    // Regression test for #1172774: Bug in Regex.java
2180647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    // Regression test for #1216887: Regular expression match is very slow
2190647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    public static final Pattern TOP_LEVEL_DOMAIN_PATTERN = Pattern.compile(
2200647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            "((aero|arpa|asia|a[cdefgilmnoqrstuwxz])"
2210647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|(biz|b[abdefghijmnorstvwyz])"
2220647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|(cat|com|coop|c[acdfghiklmnoruvxyz])"
2230647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|d[ejkmoz]"
2240647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|(edu|e[cegrstu])"
2250647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|f[ijkmor]"
2260647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|(gov|g[abdefghilmnpqrstuwy])"
2270647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|h[kmnrtu]"
2280647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|(info|int|i[delmnoqrst])"
2290647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|(jobs|j[emop])"
2300647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|k[eghimnrwyz]"
2310647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|l[abcikrstuvy]"
2320647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|(mil|mobi|museum|m[acdghklmnopqrstuvwxyz])"
2330647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|(name|net|n[acefgilopruz])"
2340647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|(org|om)"
2350647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|(pro|p[aefghklmnrstwy])"
2360647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|qa"
2370647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|r[eouw]"
2380647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|s[abcdeghijklmnortuvyz]"
2390647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|(tel|travel|t[cdfghjklmnoprtvwz])"
2400647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|u[agkmsyz]"
2410647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|v[aceginu]"
2420647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|w[fs]"
2430647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|y[etu]"
2440647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "|z[amw])");
2450647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
2460647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    public static final Pattern EMAIL_ADDRESS_PATTERN = Pattern.compile(
2470647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            "[\\+a-zA-Z0-9\\.\\_\\%\\-]+\\@"
2480647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "(("
2490647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "[a-zA-Z0-9]\\.|"
2500647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + "([a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9]\\.)+)"
2510647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + TOP_LEVEL_DOMAIN_PATTERN
2520647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson            + ")");
2530647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
2540647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    public void testMonsterRegexCorrectness() {
2550647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertTrue(EMAIL_ADDRESS_PATTERN.matcher("a+b@gmail.com").matches());
2560647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    }
2570647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson
2580647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    public void testMonsterRegexPerformance() {
2590647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        long t0 = System.currentTimeMillis();
2600647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        Matcher m = EMAIL_ADDRESS_PATTERN.matcher("donot repeate@RC8jjjjjjjjjjjjjjj");
2610647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        assertFalse(m.find());
2620647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        long t1 = System.currentTimeMillis();
2630647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson        System.out.println("RegEx performance test finished, took " + (t1 - t0) + " ms.");
2640647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson    }
2650647bfed6eda99ad77b2dfe8e3696e3fabfaf3ccJesse Wilson}
266