2008-10-02 2 views
54

में यूआरएल से मेल खाने के लिए नियमित अभिव्यक्ति नियमित अभिव्यक्तियों के साथ काम करते समय मैं रेगेक्सबड्डी का उपयोग करता हूं। इसकी लाइब्रेरी से मैंने यूआरएल से मेल खाने के लिए नियमित अभिव्यक्ति की प्रतिलिपि बनाई। मैंने RegexBuddy के भीतर सफलतापूर्वक परीक्षण किया। हालांकि, जब मैंने इसे जावा String स्वाद के रूप में कॉपी किया और इसे जावा कोड में चिपकाया, तो यह काम नहीं करता है। निम्नलिखित वर्ग प्रिंट false:जावा

public class RegexFoo { 

    public static void main(String[] args) { 
     String regex = "\\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]"; 
     String text = "http://google.com"; 
     System.out.println(IsMatch(text,regex)); 
} 

    private static boolean IsMatch(String s, String pattern) { 
     try { 
      Pattern patt = Pattern.compile(pattern); 
      Matcher matcher = patt.matcher(s); 
      return matcher.matches(); 
     } catch (RuntimeException e) { 
     return false; 
    }  
} 
} 

किसी को भी पता है मैं गलत क्या कर रहा हूँ?

+3

सर्जियो, RuntimeException पकड़ने नहीं है। यह सूक्ष्म बग पेश कर सकता है और समग्र रूप से एक खराब अभ्यास है। अगर आप परिदृश्य को अनदेखा करना चाहते हैं तो अभिव्यक्ति अवैध है:} इसके बजाय पकड़ें (PatternSyntaxException pse) {}। आइटम 57 देखें: http://java.sun.com/docs/books/effective/ – OscarRyz

+0

या आप पैटर्न पैट = Pattern.compile (पैटर्न, पैटर्न। CASE_INSENSITIVE) का उपयोग कर सकते हैं; अपरकेस और लोअरकेस दोनों से मेल खाने के लिए रेगेक्स को बदलने से बचने के लिए। – jm4

+0

मुझे पता है कि यह वास्तव में पुराना है ('08), लेकिन किसी भी व्यक्ति के लिए समान समस्याएं हैं, रेगेक्सबड्डी के पास "उपयोग" टैब है। सुनिश्चित करें कि आप पहले जावा 7 स्वाद का चयन करें, और उसके बाद "उपयोग करें" पैनल में आप इसे अपने विशिष्ट मामले के लिए जावा कोड उत्पन्न कर सकते हैं। यह मेरे लिए अच्छी तरह से काम किया। –

उत्तर

79

इसके बजाय निम्न regex स्ट्रिंग आज़माएं। आपका परीक्षण शायद केस-संवेदी तरीके से किया गया था। मैंने लोअरकेस जोर से प्लेसहोल्डर शुरू करने के साथ एक उचित स्ट्रिंग भी जोड़ा है।

String regex = "^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]"; 

यह भी काम करता है:

String regex = "\\b(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]"; 

नोट:

String regex = "<\\b(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]>"; // matches <http://google.com> 

String regex = "<^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]>"; // does not match <http://google.com> 
+0

अपनी नियमित अभिव्यक्ति का उपयोग करके मुझे भी झूठा लगता है। –

+0

क्या आपने मेरा आखिरी संपादन पकड़ लिया था। मैं वसा स्ट्रिंग की शुरुआत उँगलियों। मैंने इसे ग्रहण में कॉपी किया और मुझे "सच" मिला। – TomC

+1

धन्यवाद आदमी, पहली बार मैं stackoverflow –

56

मैं एक मानक कोशिश करता हूँ "क्यों आप इसे इस तरह से कर रहे हो?" उत्तर ... क्या आप java.net.URL के बारे में जानते हैं?

URL url = new URL(stringURL); 

चाहे वह URL पार्स नहीं कर सकता के ऊपर एक MalformedURLException फेंक देते हैं।

+1

मुझे नियमित अभिव्यक्ति सड़क से गुजरना है। जो मैं यहां पोस्ट करता हूं वह मेरे प्रश्न को स्पष्ट करने के लिए जितना संभव हो उतना आसान है। मेरे कार्यक्रम में मैं एक अधिक जटिल regex के अंदर यूआरएल regex का उपयोग कर रहा हूँ। –

+0

यह अच्छा है। मेरे पास एक बेहतर उत्तर regex-wise नहीं था, इसलिए मैंने सोचा कि मैं एक विकल्प पोस्ट करूंगा। ऐसा नहीं लगता था कि मैं इसके लिए नीचे टिकेगा, हालांकि। – billjamesdev

+2

आप सही हैं, हो सकता है कि डाउन-टिकेड थोड़ा सा था। "मैं मानक कोशिश करूंगा" बस थोड़ा आक्रामक लग रहा था। –

2

यह भी काम करता है:

String regex = "\\b(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]"; 

नोट:

String regex = "<\\b(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]>"; // matches <http://google.com> 

String regex = "<^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]>"; // does not match <http://google.com> 

तो शायद पहले एक सामान्य उपयोग के लिए अधिक उपयोगी है।

0

रीगेक्सबड्डी की लाइब्रेरी से नियमित अभिव्यक्तियों का उपयोग करते समय, लाइब्रेरी से रेगेक्स के रूप में अपने कोड में समान मिलान मोड का उपयोग करना सुनिश्चित करें। यदि आप उपयोग टैब पर एक स्रोत कोड स्निपेट जेनरेट करते हैं, तो RegexBuddy स्वचालित रूप से स्रोत कोड स्निपेट में सही मिलान विकल्प सेट कर देगा। यदि आप रेगेक्स को कॉपी/पेस्ट करते हैं, तो आपको इसे स्वयं करना होगा।

इस मामले में, जैसा कि अन्य ने बताया, आप केस असंवेदनशीलता विकल्प को चूक गए।

3
समस्या

सभी सुझाव दिया दृष्टिकोण के साथ: सभी रेगुलर एक्सप्रेशन से मान्य

सभी रेगुलर एक्सप्रेशन से आधारित कोड ओवर-इंजीनियर है है: यह केवल मान्य URL को मिलेगा! एक नमूना के रूप में, यह "http: //" से शुरू होने वाली किसी भी चीज़ को अनदेखा कर देगा और इसमें गैर-ASCII वर्ण होंगे।

और भी अधिक: मुझे जावा रेगेक्स पैकेज (पाठ से ईमेल पते को फ़िल्टर करना) के साथ 1-2-सेकेंड प्रोसेसिंग टाइम्स (सिंगल-थ्रेडेड, समर्पित) का सामना करना पड़ा है, बहुत छोटे और सरल वाक्यों के लिए, कुछ भी विशिष्ट नहीं है; संभवतः जावा 6 RegEx में बग ...

सरल/सबसे तेज़ समाधान "http: //" आदि से शुरू होने वाले टोकन को हटाने के लिए, टोकन में पाठ को विभाजित करने के लिए स्ट्रिंगटोकनाइज़र का उपयोग करना होगा, और टोकन को फिर से टेक्स्ट में जोड़ना होगा।

यदि आप टेक्स्ट से ईमेल फ़िल्टर करना चाहते हैं (क्योंकि बाद में आप एनएलपी कर्मचारी आदि करेंगे) - बस "@" वाले सभी टोकन हटा दें।

यह एक साधारण पाठ है जहां जावा 6 का RegEx विफल रहता है। जावा के divverent रूपों में इसे आज़माएं। यह रेगुलर एक्सप्रेशन से प्रति कॉल लगभग 1000 मिलीसेकेंड लेता है, एक लंबे चल एकल लड़ी परीक्षण आवेदन में:

pattern = Pattern.compile("[A-Za-z0-9](([_\\.\\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\\.\\-]?[a-zA-Z0-9]+)*)\\.([A-Za-z]{2,})", Pattern.CASE_INSENSITIVE); 

"Avalanna is such a sweet little girl! It would b heartbreaking if cancer won. She's so precious! #BeliebersPrayForAvalanna"); 
"@AndySamuels31 Hahahahahahahahahhaha lol, you don't look like a girl hahahahhaahaha, you are... sexy."; 

नियमित अभिव्यक्ति पर भरोसा न करें यदि आप केवल "@", "http: //" के साथ शब्द फिल्टर करने के लिए की जरूरत है, "ftp: //", "mailto:"; यह विशाल इंजीनियरिंग ओवरहेड है।

तुम सच में जावा के साथ रेगुलर एक्सप्रेशन से उपयोग करना चाहते हैं, अब यह करने के लिए Automaton

+0

लॉल। Automaton कैप्चर समूहों का समर्थन नहीं करता है। – user1050755

+2

मुझे आपकी चिंता नहीं है। स्वीकृत उत्तर का रेगेक्स वास्तव में यूआरएल को मान्य करने के लिए अच्छी तरह से काम करता है। आप इसे समझने लगते हैं, 'यह केवल वैध यूआरएल मिलेगा!' - यह ओपी के सवाल का लक्ष्य है। क्या मैं कुछ भूल रहा हूँ? – mmcrae

71

सबसे अच्छा तरीका है की कोशिश है:

android.util.Patterns.WEB_URL.matcher(linkUrl).matches(); 

संपादित करें: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/util/Patterns.java से Patterns का कोड:

/* 
* Copyright (C) 2007 The Android Open Source Project 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

package android.util; 

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

/** 
* Commonly used regular expression patterns. 
*/ 
public class Patterns { 
    /** 
    * Regular expression to match all IANA top-level domains. 
    * List accurate as of 2011/07/18. List taken from: 
    * http://data.iana.org/TLD/tlds-alpha-by-domain.txt 
    * This pattern is auto-generated by frameworks/ex/common/tools/make-iana-tld-pattern.py 
    * 
    * @deprecated Due to the recent profileration of gTLDs, this API is 
    * expected to become out-of-date very quickly. Therefore it is now 
    * deprecated. 
    */ 
    @Deprecated 
    public static final String TOP_LEVEL_DOMAIN_STR = 
     "((aero|arpa|asia|a[cdefgilmnoqrstuwxz])" 
     + "|(biz|b[abdefghijmnorstvwyz])" 
     + "|(cat|com|coop|c[acdfghiklmnoruvxyz])" 
     + "|d[ejkmoz]" 
     + "|(edu|e[cegrstu])" 
     + "|f[ijkmor]" 
     + "|(gov|g[abdefghilmnpqrstuwy])" 
     + "|h[kmnrtu]" 
     + "|(info|int|i[delmnoqrst])" 
     + "|(jobs|j[emop])" 
     + "|k[eghimnprwyz]" 
     + "|l[abcikrstuvy]" 
     + "|(mil|mobi|museum|m[acdeghklmnopqrstuvwxyz])" 
     + "|(name|net|n[acefgilopruz])" 
     + "|(org|om)" 
     + "|(pro|p[aefghklmnrstwy])" 
     + "|qa" 
     + "|r[eosuw]" 
     + "|s[abcdeghijklmnortuvyz]" 
     + "|(tel|travel|t[cdfghjklmnoprtvwz])" 
     + "|u[agksyz]" 
     + "|v[aceginu]" 
     + "|w[fs]" 
     + "|(\u03b4\u03bf\u03ba\u03b9\u03bc\u03ae|\u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0435|\u0440\u0444|\u0441\u0440\u0431|\u05d8\u05e2\u05e1\u05d8|\u0622\u0632\u0645\u0627\u06cc\u0634\u06cc|\u0625\u062e\u062a\u0628\u0627\u0631|\u0627\u0644\u0627\u0631\u062f\u0646|\u0627\u0644\u062c\u0632\u0627\u0626\u0631|\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629|\u0627\u0644\u0645\u063a\u0631\u0628|\u0627\u0645\u0627\u0631\u0627\u062a|\u0628\u06be\u0627\u0631\u062a|\u062a\u0648\u0646\u0633|\u0633\u0648\u0631\u064a\u0629|\u0641\u0644\u0633\u0637\u064a\u0646|\u0642\u0637\u0631|\u0645\u0635\u0631|\u092a\u0930\u0940\u0915\u094d\u0937\u093e|\u092d\u093e\u0930\u0924|\u09ad\u09be\u09b0\u09a4|\u0a2d\u0a3e\u0a30\u0a24|\u0aad\u0abe\u0ab0\u0aa4|\u0b87\u0ba8\u0bcd\u0ba4\u0bbf\u0baf\u0bbe|\u0b87\u0bb2\u0b99\u0bcd\u0b95\u0bc8|\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0bc2\u0bb0\u0bcd|\u0baa\u0bb0\u0bbf\u0b9f\u0bcd\u0b9a\u0bc8|\u0c2d\u0c3e\u0c30\u0c24\u0c4d|\u0dbd\u0d82\u0d9a\u0dcf|\u0e44\u0e17\u0e22|\u30c6\u30b9\u30c8|\u4e2d\u56fd|\u4e2d\u570b|\u53f0\u6e7e|\u53f0\u7063|\u65b0\u52a0\u5761|\u6d4b\u8bd5|\u6e2c\u8a66|\u9999\u6e2f|\ud14c\uc2a4\ud2b8|\ud55c\uad6d|xn\\-\\-0zwm56d|xn\\-\\-11b5bs3a9aj6g|xn\\-\\-3e0b707e|xn\\-\\-45brj9c|xn\\-\\-80akhbyknj4f|xn\\-\\-90a3ac|xn\\-\\-9t4b11yi5a|xn\\-\\-clchc0ea0b2g2a9gcd|xn\\-\\-deba0ad|xn\\-\\-fiqs8s|xn\\-\\-fiqz9s|xn\\-\\-fpcrj9c3d|xn\\-\\-fzc2c9e2c|xn\\-\\-g6w251d|xn\\-\\-gecrj9c|xn\\-\\-h2brj9c|xn\\-\\-hgbk6aj7f53bba|xn\\-\\-hlcj6aya9esc7a|xn\\-\\-j6w193g|xn\\-\\-jxalpdlp|xn\\-\\-kgbechtv|xn\\-\\-kprw13d|xn\\-\\-kpry57d|xn\\-\\-lgbbat1ad8j|xn\\-\\-mgbaam7a8h|xn\\-\\-mgbayh7gpa|xn\\-\\-mgbbh1a71e|xn\\-\\-mgbc0a9azcg|xn\\-\\-mgberp4a5d4ar|xn\\-\\-o3cw4h|xn\\-\\-ogbpf8fl|xn\\-\\-p1ai|xn\\-\\-pgbs0dh|xn\\-\\-s9brj9c|xn\\-\\-wgbh1c|xn\\-\\-wgbl6a|xn\\-\\-xkc2al3hye2a|xn\\-\\-xkc2dl3a5ee0h|xn\\-\\-yfro4i67o|xn\\-\\-ygbi2ammx|xn\\-\\-zckzah|xxx)" 
     + "|y[et]" 
     + "|z[amw])"; 

    /** 
    * Regular expression pattern to match all IANA top-level domains. 
    * @deprecated This API is deprecated. See {@link #TOP_LEVEL_DOMAIN_STR}. 
    */ 
    @Deprecated 
    public static final Pattern TOP_LEVEL_DOMAIN = 
     Pattern.compile(TOP_LEVEL_DOMAIN_STR); 

    /** 
    * Regular expression to match all IANA top-level domains for WEB_URL. 
    * List accurate as of 2011/07/18. List taken from: 
    * http://data.iana.org/TLD/tlds-alpha-by-domain.txt 
    * This pattern is auto-generated by frameworks/ex/common/tools/make-iana-tld-pattern.py 
    * 
    * @deprecated This API is deprecated. See {@link #TOP_LEVEL_DOMAIN_STR}. 
    */ 
    @Deprecated 
    public static final String TOP_LEVEL_DOMAIN_STR_FOR_WEB_URL = 
     "(?:" 
     + "(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])" 
     + "|(?:biz|b[abdefghijmnorstvwyz])" 
     + "|(?:cat|com|coop|c[acdfghiklmnoruvxyz])" 
     + "|d[ejkmoz]" 
     + "|(?:edu|e[cegrstu])" 
     + "|f[ijkmor]" 
     + "|(?:gov|g[abdefghilmnpqrstuwy])" 
     + "|h[kmnrtu]" 
     + "|(?:info|int|i[delmnoqrst])" 
     + "|(?:jobs|j[emop])" 
     + "|k[eghimnprwyz]" 
     + "|l[abcikrstuvy]" 
     + "|(?:mil|mobi|museum|m[acdeghklmnopqrstuvwxyz])" 
     + "|(?:name|net|n[acefgilopruz])" 
     + "|(?:org|om)" 
     + "|(?:pro|p[aefghklmnrstwy])" 
     + "|qa" 
     + "|r[eosuw]" 
     + "|s[abcdeghijklmnortuvyz]" 
     + "|(?:tel|travel|t[cdfghjklmnoprtvwz])" 
     + "|u[agksyz]" 
     + "|v[aceginu]" 
     + "|w[fs]" 
     + "|(?:\u03b4\u03bf\u03ba\u03b9\u03bc\u03ae|\u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0435|\u0440\u0444|\u0441\u0440\u0431|\u05d8\u05e2\u05e1\u05d8|\u0622\u0632\u0645\u0627\u06cc\u0634\u06cc|\u0625\u062e\u062a\u0628\u0627\u0631|\u0627\u0644\u0627\u0631\u062f\u0646|\u0627\u0644\u062c\u0632\u0627\u0626\u0631|\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629|\u0627\u0644\u0645\u063a\u0631\u0628|\u0627\u0645\u0627\u0631\u0627\u062a|\u0628\u06be\u0627\u0631\u062a|\u062a\u0648\u0646\u0633|\u0633\u0648\u0631\u064a\u0629|\u0641\u0644\u0633\u0637\u064a\u0646|\u0642\u0637\u0631|\u0645\u0635\u0631|\u092a\u0930\u0940\u0915\u094d\u0937\u093e|\u092d\u093e\u0930\u0924|\u09ad\u09be\u09b0\u09a4|\u0a2d\u0a3e\u0a30\u0a24|\u0aad\u0abe\u0ab0\u0aa4|\u0b87\u0ba8\u0bcd\u0ba4\u0bbf\u0baf\u0bbe|\u0b87\u0bb2\u0b99\u0bcd\u0b95\u0bc8|\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0bc2\u0bb0\u0bcd|\u0baa\u0bb0\u0bbf\u0b9f\u0bcd\u0b9a\u0bc8|\u0c2d\u0c3e\u0c30\u0c24\u0c4d|\u0dbd\u0d82\u0d9a\u0dcf|\u0e44\u0e17\u0e22|\u30c6\u30b9\u30c8|\u4e2d\u56fd|\u4e2d\u570b|\u53f0\u6e7e|\u53f0\u7063|\u65b0\u52a0\u5761|\u6d4b\u8bd5|\u6e2c\u8a66|\u9999\u6e2f|\ud14c\uc2a4\ud2b8|\ud55c\uad6d|xn\\-\\-0zwm56d|xn\\-\\-11b5bs3a9aj6g|xn\\-\\-3e0b707e|xn\\-\\-45brj9c|xn\\-\\-80akhbyknj4f|xn\\-\\-90a3ac|xn\\-\\-9t4b11yi5a|xn\\-\\-clchc0ea0b2g2a9gcd|xn\\-\\-deba0ad|xn\\-\\-fiqs8s|xn\\-\\-fiqz9s|xn\\-\\-fpcrj9c3d|xn\\-\\-fzc2c9e2c|xn\\-\\-g6w251d|xn\\-\\-gecrj9c|xn\\-\\-h2brj9c|xn\\-\\-hgbk6aj7f53bba|xn\\-\\-hlcj6aya9esc7a|xn\\-\\-j6w193g|xn\\-\\-jxalpdlp|xn\\-\\-kgbechtv|xn\\-\\-kprw13d|xn\\-\\-kpry57d|xn\\-\\-lgbbat1ad8j|xn\\-\\-mgbaam7a8h|xn\\-\\-mgbayh7gpa|xn\\-\\-mgbbh1a71e|xn\\-\\-mgbc0a9azcg|xn\\-\\-mgberp4a5d4ar|xn\\-\\-o3cw4h|xn\\-\\-ogbpf8fl|xn\\-\\-p1ai|xn\\-\\-pgbs0dh|xn\\-\\-s9brj9c|xn\\-\\-wgbh1c|xn\\-\\-wgbl6a|xn\\-\\-xkc2al3hye2a|xn\\-\\-xkc2dl3a5ee0h|xn\\-\\-yfro4i67o|xn\\-\\-ygbi2ammx|xn\\-\\-zckzah|xxx)" 
     + "|y[et]" 
     + "|z[amw]))"; 

    /** 
    * Good characters for Internationalized Resource Identifiers (IRI). 
    * This comprises most common used Unicode characters allowed in IRI 
    * as detailed in RFC 3987. 
    * Specifically, those two byte Unicode characters are not included. 
    */ 
    public static final String GOOD_IRI_CHAR = 
     "a-zA-Z0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF"; 

    public static final Pattern IP_ADDRESS 
     = Pattern.compile(
      "((25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(25[0-5]|2[0-4]" 
      + "[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]" 
      + "[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}" 
      + "|[1-9][0-9]|[0-9]))"); 

    /** 
    * RFC 1035 Section 2.3.4 limits the labels to a maximum 63 octets. 
    */ 
    private static final String IRI 
     = "[" + GOOD_IRI_CHAR + "]([" + GOOD_IRI_CHAR + "\\-]{0,61}[" + GOOD_IRI_CHAR + "]){0,1}"; 

    private static final String GOOD_GTLD_CHAR = 
     "a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF"; 
    private static final String GTLD = "[" + GOOD_GTLD_CHAR + "]{2,63}"; 
    private static final String HOST_NAME = "(" + IRI + "\\.)+" + GTLD; 

    public static final Pattern DOMAIN_NAME 
     = Pattern.compile("(" + HOST_NAME + "|" + IP_ADDRESS + ")"); 

    /** 
    * Regular expression pattern to match most part of RFC 3987 
    * Internationalized URLs, aka IRIs. Commonly used Unicode characters are 
    * added. 
    */ 
    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})?\\@)?)?" 
     + "(?:" + DOMAIN_NAME + ")" 
     + "(?:\\:\\d{1,5})?)" // plus option port number 
     + "(\\/(?:(?:[" + GOOD_IRI_CHAR + "\\;\\/\\?\\:\\@\\&\\=\\#\\~" // plus option query params 
     + "\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])|(?:\\%[a-fA-F0-9]{2}))*)?" 
     + "(?:\\b|$)"); // and finally, a word boundary or end of 
         // input. This is to stop foo.sure from 
         // matching as foo.su 

    public static final Pattern EMAIL_ADDRESS 
     = Pattern.compile(
      "[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}" + 
      "\\@" + 
      "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}" + 
      "(" + 
       "\\." + 
       "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" + 
      ")+" 
     ); 

    /** 
    * This pattern is intended for searching for things that look like they 
    * might be phone numbers in arbitrary text, not for validating whether 
    * something is in fact a phone number. It will miss many things that 
    * are legitimate phone numbers. 
    * 
    * <p> The pattern matches the following: 
    * <ul> 
    * <li>Optionally, a + sign followed immediately by one or more digits. Spaces, dots, or dashes 
    * may follow. 
    * <li>Optionally, sets of digits in parentheses, separated by spaces, dots, or dashes. 
    * <li>A string starting and ending with a digit, containing digits, spaces, dots, and/or dashes. 
    * </ul> 
    */ 
    public static final Pattern PHONE 
     = Pattern.compile(      // sdd = space, dot, or dash 
       "(\\+[0-9]+[\\- \\.]*)?"  // +<digits><sdd>* 
       + "(\\([0-9]+\\)[\\- \\.]*)?" // (<digits>)<sdd>* 
       + "([0-9][0-9\\- \\.]+[0-9])"); // <digit><digit|sdd>+<digit> 

    /** 
    * Convenience method to take all of the non-null matching groups in a 
    * regex Matcher and return them as a concatenated string. 
    * 
    * @param matcher  The Matcher object from which grouped text will 
    *      be extracted 
    * 
    * @return    A String comprising all of the non-null matched 
    *      groups concatenated together 
    */ 
    public static final String concatGroups(Matcher matcher) { 
     StringBuilder b = new StringBuilder(); 
     final int numGroups = matcher.groupCount(); 

     for (int i = 1; i <= numGroups; i++) { 
      String s = matcher.group(i); 

      if (s != null) { 
       b.append(s); 
      } 
     } 

     return b.toString(); 
    } 

    /** 
    * Convenience method to return only the digits and plus signs 
    * in the matching string. 
    * 
    * @param matcher  The Matcher object from which digits and plus will 
    *      be extracted 
    * 
    * @return    A String comprising all of the digits and plus in 
    *      the match 
    */ 
    public static final String digitsAndPlusOnly(Matcher matcher) { 
     StringBuilder buffer = new StringBuilder(); 
     String matchingRegion = matcher.group(); 

     for (int i = 0, size = matchingRegion.length(); i < size; i++) { 
      char character = matchingRegion.charAt(i); 

      if (character == '+' || Character.isDigit(character)) { 
       buffer.append(character); 
      } 
     } 
     return buffer.toString(); 
    } 

    /** 
    * Do not create this static utility class. 
    */ 
    private Patterns() {} 
} 
+3

आपके लिए +1! बहुत बहुत धन्यवाद!!! यह बहुत अच्छा कोड है! हर कोई मुश्किल रेगेक्स के साथ कोशिश कर रहा है, जबकि यह आसान हो सकता है। बहुत बढ़िया! –

+0

यह सही उत्तर – JPM

+6

@JPM होना चाहिए इसके अलावा ओपी जावा समाधान की तलाश में था, एक एंड्रॉइड विशिष्ट नहीं (एक क्यू के लिए विशिष्ट टैग को देखना भूलना आसान है)। फिर भी, उन लोगों के लिए एक अच्छी बात है जो एंड्रॉइड के लिए कोड करते हैं ताकि मैं जान सकूं। – indivisible

2

बिलजेम्सडेव उत्तर के साथ लाइन में, RegEx:

का उपयोग किये बिना यूआरएल को सत्यापित करने का एक और तरीका है

Apache Commons Validator lib से, UrlValidator पर कक्षा देखें। कुछ उदाहरण कोड:

"http" और "https" की वैध योजनाओं के साथ एक UrlValidator का निर्माण करें।

String[] schemes = {"http","https"}. 
UrlValidator urlValidator = new UrlValidator(schemes); 
if (urlValidator.isValid("ftp://foo.bar.com/")) { 
    System.out.println("url is valid"); 
} else { 
    System.out.println("url is invalid"); 
} 

prints "url is invalid" 

यदि डिफ़ॉल्ट डिज़ाइनर का उपयोग किया जाता है।

UrlValidator urlValidator = new UrlValidator(); 
if (urlValidator.isValid("ftp://foo.bar.com/")) { 
    System.out.println("url is valid"); 
} else { 
    System.out.println("url is invalid"); 
} 

प्रिंट आउट "यूआरएल वैध है"