Loading common/java/com/android/common/Patterns.java +74 −74 Original line number Diff line number Diff line Loading @@ -25,12 +25,11 @@ import java.util.regex.Pattern; public class Patterns { /** * Regular expression pattern to match all IANA top-level domains. * List accurate as of 2007/06/15. List taken from: * List accurate as of 2010/02/05. List taken from: * http://data.iana.org/TLD/tlds-alpha-by-domain.txt * This pattern is auto-generated by //device/tools/make-iana-tld-pattern.py * This pattern is auto-generated by development/tools/make-iana-tld-pattern.py */ public static final Pattern TOP_LEVEL_DOMAIN = Pattern.compile( public static final Pattern TOP_LEVEL_DOMAIN = Pattern.compile( "((aero|arpa|asia|a[cdefgilmnoqrstuwxz])" + "|(biz|b[abdefghijmnorstvwyz])" + "|(cat|com|coop|c[acdfghiklmnoruvxyz])" Loading @@ -41,30 +40,30 @@ public class Patterns { + "|h[kmnrtu]" + "|(info|int|i[delmnoqrst])" + "|(jobs|j[emop])" + "|k[eghimnrwyz]" + "|k[eghimnprwyz]" + "|l[abcikrstuvy]" + "|(mil|mobi|museum|m[acdghklmnopqrstuvwxyz])" + "|(mil|mobi|museum|m[acdeghklmnopqrstuvwxyz])" + "|(name|net|n[acefgilopruz])" + "|(org|om)" + "|(pro|p[aefghklmnrstwy])" + "|qa" + "|r[eouw]" + "|r[eosuw]" + "|s[abcdeghijklmnortuvyz]" + "|(tel|travel|t[cdfghjklmnoprtvwz])" + "|u[agkmsyz]" + "|u[agksyz]" + "|v[aceginu]" + "|w[fs]" + "|(xn\\-\\-0zwm56d|xn\\-\\-11b5bs3a9aj6g|xn\\-\\-80akhbyknj4f|xn\\-\\-9t4b11yi5a|xn\\-\\-deba0ad|xn\\-\\-g6w251d|xn\\-\\-hgbk6aj7f53bba|xn\\-\\-hlcj6aya9esc7a|xn\\-\\-jxalpdlp|xn\\-\\-kgbechtv|xn\\-\\-zckzah)" + "|y[etu]" + "|z[amw])"); /** * Regular expression pattern to match RFC 1738 URLs * List accurate as of 2007/06/15. List taken from: * List accurate as of 2010/02/05. List taken from: * http://data.iana.org/TLD/tlds-alpha-by-domain.txt * This pattern is auto-generated by //device/tools/make-iana-tld-pattern.py * This pattern is auto-generated by development/tools/make-iana-tld-pattern.py */ public static final Pattern WEB_URL = Pattern.compile( public static final Pattern WEB_URL = Pattern.compile( "((?:(http|https|Http|Https|rtsp|Rtsp):\\/\\/(?:(?:[a-zA-Z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)" + "\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,64}(?:\\:(?:[a-zA-Z0-9\\$\\-\\_" + "\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,25})?\\@)?)?" Loading @@ -80,19 +79,20 @@ public class Patterns { + "|h[kmnrtu]" + "|(?:info|int|i[delmnoqrst])" + "|(?:jobs|j[emop])" + "|k[eghimnrwyz]" + "|k[eghimnprwyz]" + "|l[abcikrstuvy]" + "|(?:mil|mobi|museum|m[acdghklmnopqrstuvwxyz])" + "|(?:mil|mobi|museum|m[acdeghklmnopqrstuvwxyz])" + "|(?:name|net|n[acefgilopruz])" + "|(?:org|om)" + "|(?:pro|p[aefghklmnrstwy])" + "|qa" + "|r[eouw]" + "|r[eosuw]" + "|s[abcdeghijklmnortuvyz]" + "|(?:tel|travel|t[cdfghjklmnoprtvwz])" + "|u[agkmsyz]" + "|u[agksyz]" + "|v[aceginu]" + "|w[fs]" + "|(?:xn\\-\\-0zwm56d|xn\\-\\-11b5bs3a9aj6g|xn\\-\\-80akhbyknj4f|xn\\-\\-9t4b11yi5a|xn\\-\\-deba0ad|xn\\-\\-g6w251d|xn\\-\\-hgbk6aj7f53bba|xn\\-\\-hlcj6aya9esc7a|xn\\-\\-jxalpdlp|xn\\-\\-kgbechtv|xn\\-\\-zckzah)" + "|y[etu]" + "|z[amw]))" + "|(?:(?:25[0-5]|2[0-4]" // or ip address Loading common/tests/src/com/android/common/PatternsTest.java +26 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,20 @@ public class PatternsTest extends TestCase { t = Patterns.TOP_LEVEL_DOMAIN.matcher("com").matches(); assertTrue("Missed valid TLD", t); // One of the new top level domain. t = Patterns.TOP_LEVEL_DOMAIN.matcher("me").matches(); assertTrue("Missed valid TLD", t); // One of the new top level test domain. t = Patterns.TOP_LEVEL_DOMAIN.matcher("xn--0zwm56d").matches(); assertTrue("Missed valid TLD", t); t = Patterns.TOP_LEVEL_DOMAIN.matcher("mem").matches(); assertFalse("Matched invalid TLD!", t); t = Patterns.TOP_LEVEL_DOMAIN.matcher("xn").matches(); assertFalse("Matched invalid TLD!", t); t = Patterns.TOP_LEVEL_DOMAIN.matcher("xer").matches(); assertFalse("Matched invalid TLD!", t); } Loading @@ -42,6 +56,18 @@ public class PatternsTest extends TestCase { t = Patterns.WEB_URL.matcher("http://www.google.com").matches(); assertTrue("Valid URL", t); // Google in one of the new top level domain. t = Patterns.WEB_URL.matcher("http://www.google.me").matches(); assertTrue("Valid URL", t); t = Patterns.WEB_URL.matcher("google.me").matches(); assertTrue("Valid URL", t); // Test url in Chinese: http://xn--fsqu00a.xn--0zwm56d t = Patterns.WEB_URL.matcher("http://xn--fsqu00a.xn--0zwm56d").matches(); assertTrue("Valid URL", t); t = Patterns.WEB_URL.matcher("xn--fsqu00a.xn--0zwm56d").matches(); assertTrue("Valid URL", t); t = Patterns.WEB_URL.matcher("ftp://www.example.com").matches(); assertFalse("Matched invalid protocol", t); Loading Loading
common/java/com/android/common/Patterns.java +74 −74 Original line number Diff line number Diff line Loading @@ -25,12 +25,11 @@ import java.util.regex.Pattern; public class Patterns { /** * Regular expression pattern to match all IANA top-level domains. * List accurate as of 2007/06/15. List taken from: * List accurate as of 2010/02/05. List taken from: * http://data.iana.org/TLD/tlds-alpha-by-domain.txt * This pattern is auto-generated by //device/tools/make-iana-tld-pattern.py * This pattern is auto-generated by development/tools/make-iana-tld-pattern.py */ public static final Pattern TOP_LEVEL_DOMAIN = Pattern.compile( public static final Pattern TOP_LEVEL_DOMAIN = Pattern.compile( "((aero|arpa|asia|a[cdefgilmnoqrstuwxz])" + "|(biz|b[abdefghijmnorstvwyz])" + "|(cat|com|coop|c[acdfghiklmnoruvxyz])" Loading @@ -41,30 +40,30 @@ public class Patterns { + "|h[kmnrtu]" + "|(info|int|i[delmnoqrst])" + "|(jobs|j[emop])" + "|k[eghimnrwyz]" + "|k[eghimnprwyz]" + "|l[abcikrstuvy]" + "|(mil|mobi|museum|m[acdghklmnopqrstuvwxyz])" + "|(mil|mobi|museum|m[acdeghklmnopqrstuvwxyz])" + "|(name|net|n[acefgilopruz])" + "|(org|om)" + "|(pro|p[aefghklmnrstwy])" + "|qa" + "|r[eouw]" + "|r[eosuw]" + "|s[abcdeghijklmnortuvyz]" + "|(tel|travel|t[cdfghjklmnoprtvwz])" + "|u[agkmsyz]" + "|u[agksyz]" + "|v[aceginu]" + "|w[fs]" + "|(xn\\-\\-0zwm56d|xn\\-\\-11b5bs3a9aj6g|xn\\-\\-80akhbyknj4f|xn\\-\\-9t4b11yi5a|xn\\-\\-deba0ad|xn\\-\\-g6w251d|xn\\-\\-hgbk6aj7f53bba|xn\\-\\-hlcj6aya9esc7a|xn\\-\\-jxalpdlp|xn\\-\\-kgbechtv|xn\\-\\-zckzah)" + "|y[etu]" + "|z[amw])"); /** * Regular expression pattern to match RFC 1738 URLs * List accurate as of 2007/06/15. List taken from: * List accurate as of 2010/02/05. List taken from: * http://data.iana.org/TLD/tlds-alpha-by-domain.txt * This pattern is auto-generated by //device/tools/make-iana-tld-pattern.py * This pattern is auto-generated by development/tools/make-iana-tld-pattern.py */ public static final Pattern WEB_URL = Pattern.compile( public static final Pattern WEB_URL = Pattern.compile( "((?:(http|https|Http|Https|rtsp|Rtsp):\\/\\/(?:(?:[a-zA-Z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)" + "\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,64}(?:\\:(?:[a-zA-Z0-9\\$\\-\\_" + "\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,25})?\\@)?)?" Loading @@ -80,19 +79,20 @@ public class Patterns { + "|h[kmnrtu]" + "|(?:info|int|i[delmnoqrst])" + "|(?:jobs|j[emop])" + "|k[eghimnrwyz]" + "|k[eghimnprwyz]" + "|l[abcikrstuvy]" + "|(?:mil|mobi|museum|m[acdghklmnopqrstuvwxyz])" + "|(?:mil|mobi|museum|m[acdeghklmnopqrstuvwxyz])" + "|(?:name|net|n[acefgilopruz])" + "|(?:org|om)" + "|(?:pro|p[aefghklmnrstwy])" + "|qa" + "|r[eouw]" + "|r[eosuw]" + "|s[abcdeghijklmnortuvyz]" + "|(?:tel|travel|t[cdfghjklmnoprtvwz])" + "|u[agkmsyz]" + "|u[agksyz]" + "|v[aceginu]" + "|w[fs]" + "|(?:xn\\-\\-0zwm56d|xn\\-\\-11b5bs3a9aj6g|xn\\-\\-80akhbyknj4f|xn\\-\\-9t4b11yi5a|xn\\-\\-deba0ad|xn\\-\\-g6w251d|xn\\-\\-hgbk6aj7f53bba|xn\\-\\-hlcj6aya9esc7a|xn\\-\\-jxalpdlp|xn\\-\\-kgbechtv|xn\\-\\-zckzah)" + "|y[etu]" + "|z[amw]))" + "|(?:(?:25[0-5]|2[0-4]" // or ip address Loading
common/tests/src/com/android/common/PatternsTest.java +26 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,20 @@ public class PatternsTest extends TestCase { t = Patterns.TOP_LEVEL_DOMAIN.matcher("com").matches(); assertTrue("Missed valid TLD", t); // One of the new top level domain. t = Patterns.TOP_LEVEL_DOMAIN.matcher("me").matches(); assertTrue("Missed valid TLD", t); // One of the new top level test domain. t = Patterns.TOP_LEVEL_DOMAIN.matcher("xn--0zwm56d").matches(); assertTrue("Missed valid TLD", t); t = Patterns.TOP_LEVEL_DOMAIN.matcher("mem").matches(); assertFalse("Matched invalid TLD!", t); t = Patterns.TOP_LEVEL_DOMAIN.matcher("xn").matches(); assertFalse("Matched invalid TLD!", t); t = Patterns.TOP_LEVEL_DOMAIN.matcher("xer").matches(); assertFalse("Matched invalid TLD!", t); } Loading @@ -42,6 +56,18 @@ public class PatternsTest extends TestCase { t = Patterns.WEB_URL.matcher("http://www.google.com").matches(); assertTrue("Valid URL", t); // Google in one of the new top level domain. t = Patterns.WEB_URL.matcher("http://www.google.me").matches(); assertTrue("Valid URL", t); t = Patterns.WEB_URL.matcher("google.me").matches(); assertTrue("Valid URL", t); // Test url in Chinese: http://xn--fsqu00a.xn--0zwm56d t = Patterns.WEB_URL.matcher("http://xn--fsqu00a.xn--0zwm56d").matches(); assertTrue("Valid URL", t); t = Patterns.WEB_URL.matcher("xn--fsqu00a.xn--0zwm56d").matches(); assertTrue("Valid URL", t); t = Patterns.WEB_URL.matcher("ftp://www.example.com").matches(); assertFalse("Matched invalid protocol", t); Loading