जावा में यूआरएल से मिलान करने के लिए नियमित अभिव्यक्ति


86

मैं रेग्युलर एक्सप्रेशंस के साथ काम करते हुए रेगेक्सबॉडी का उपयोग करता हूं। इसकी लाइब्रेरी से मैंने यूआरएल से मिलान करने के लिए नियमित अभिव्यक्ति की नकल की। मैंने 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;
    }       
}   
}

क्या कोई जानता है कि मुझसे क्या गलती हो रही है?


4
सर्जियो, RuntimeException को पकड़ नहीं है। यह सूक्ष्म बग का परिचय दे सकता है और यह एक बुरा अभ्यास है। यदि आप अभिव्यक्ति को अवैध होने पर परिदृश्य को नजरअंदाज करना चाहते हैं, तो इसके बजाय:} कैच (पैटर्नसाइनटैक्सएक्ससेप्शन pse) {}। आइटम नंबर
OscarRyz

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

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

जवाबों:


106

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

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>

1
अपनी नियमित अभिव्यक्ति का उपयोग करके मैं भी गलत हो जाता हूं।
सर्जियो डेल एमो

क्या आपने मेरा अंतिम संपादन पकड़ा है मैंने वसा स्ट्रिंग की शुरुआत में ऊँगली की। मैंने इसे केवल ग्रहण में कॉपी किया और मुझे "सच" मिला।
टॉम 12

1
धन्यवाद आदमी, मैं पहली बार स्टैकओवरफ्लो में टिप्पणियों की उपयोगिता देखता हूं
सर्जियो डेल एमियो

1
कोई दिक्कत नहीं है। आप यहाँ प्लगइन उपलब्ध RegEx परीक्षक का उपयोग करके की तरह ग्रहण मैं उपयोग कर रहे हैं brosinski.com/regex
TomC

लिंक के लिए thansk मैं ग्रहण का उपयोग कर रहा हूं
सर्जियो डेल एमो

96

अब इसे करने का सबसे अच्छा तरीका है:

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

EDIT: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/util/Patterns.javaPatterns से कोड :

/*
 * 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! बहुत बहुत धन्यवाद!!! यह महान कोड है! हर कोई इसे मुश्किल रीगेक्स के साथ आजमा रहा है जबकि यह आसान हो सकता है। बहुत बढ़िया!
केविन वैन मिर्लो

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

3
@indivoice सौभाग्य से, एंड्रॉइड ओपन सोर्स है और आप github.com/android/platform_frameworks_base/blob/master/core/… :) से कोड प्राप्त कर सकते हैं
एपिकपांडफोर्स

3
@EpicPandaForce मुझे लगता है कि आपकी टिप्पणी ही इस उत्तर को स्वीकार्य / सहायक बनाने वाली एकमात्र चीज़ है, क्योंकि प्रश्न javaसमाधान की तलाश में है, न किandroid
डॉन चेडल

1
यह जाँच नहीं करता है कि url http या https से शुरू होता है या नहीं। मैंने www.www के साथ परीक्षण किया और इसने मुझे सच कर दिया। तो मेरे लिए उपयोगी नहीं है
FaisalAhmed

74

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

URL url = new URL(stringURL);

MalformedURLExceptionअगर यह URL को पार्स नहीं कर सकता है तो ऊपर वाला फेंक देगा ।


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

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

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

शांत (क्षमा करें, जल्दी छुट्टी)। हां, निश्चित रूप से इस तरह इरादा नहीं था। मैं सिर्फ यह देखता हूं कि यहां बहुत कुछ है, और कभी-कभी यह मदद भी करता है।
बिलजमदेव

14
"नया URL" केवल MalformedURLException को फेंकता है यदि पोर्ट <0 या यह प्रोटोकॉल को नहीं समझता है। इसके अलावा कुछ भी नहीं जाता है। यह पकड़ नहीं होगा: 1.2.3। १.२.३.४.५ १.२,३.४.५ : आदि
डेविड

4

सभी सुझाए गए दृष्टिकोणों के साथ समस्या: सभी RegEx को मान्य कर रहा है

सभी RegEx -based कोड अति-इंजीनियर है: यह केवल मान्य URL खोजेगा! एक नमूने के रूप में, यह "http: //" से शुरू होने वाली और अंदर गैर-एएससीआईआई अक्षरों के साथ कुछ भी अनदेखा कर देगा।

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

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

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

यह सरल पाठ है जहाँ जावा 6 का RegEx विफल रहता है। इसे जावा के विभक्त रूपों में आज़माएँ। एक लंबे समय से चल रहे सिंगल थ्रेडेड टेस्ट एप्लिकेशन में RegEx कॉल के लिए लगभग 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:" के साथ शब्दों को फ़िल्टर करने की आवश्यकता है, तो नियमित अभिव्यक्तियों पर भरोसा न करें; यह बहुत बड़ा इंजीनियरिंग है।

यदि आप वास्तव में जावा के साथ RegEx का उपयोग करना चाहते हैं, तो Automaton की कोशिश करें


जबरदस्त हंसी। Automaton कैप्चर समूहों का समर्थन नहीं करता है।
user1050755

4
मुझे आपकी चिंता नहीं है। स्वीकृत उत्तर का रेगेक्स वास्तव में URL के सत्यापन के लिए अच्छा काम करता है। आप इसे व्युत्पन्न करते हुए कहते हैं it will find only valid URLs!- यह ओपी के प्रश्न का लक्ष्य है। क्या मैं कुछ भूल रहा हूँ?
डॉन चेडल

3

बिलजमदेव उत्तर के अनुसार, यहां एक RegEx का उपयोग किए बिना URL को मान्य करने का एक और तरीका है:

से अपाचे कॉमन्स सत्यापनकर्ता 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");
}

प्रिंट "url मान्य है"


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>

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


1
((http?|https|ftp|file)://)?((W|w){3}.)?[a-zA-Z0-9]+\.[a-zA-Z]+

यहाँ देखें: - https://www.freeformatter.com/java-regex-tester.html#ad-output

यह सही ढंग से शोध प्रविष्टियों को हल करता है


यह विशेष वर्णों के लिए विफल रहता है
संकल्प कोटवार

मुझे गीत के नाम से url निकालने के लिए regex की आवश्यकता थी। कैन्टेन को एक या मुझे यह कहना चाहिए कि मैं सबसे अधिक असफल रहा, इसलिए मैंने अपने लिए और उन मामलों पर काम किया :)
अभिराज

हाँ, यह करता है। दिए गए लिंक पर इसे जांचें।
अभिराज १४'१

0

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.