it-swarm.com.de

URL aus einer Zeichenfolge ermitteln und extrahieren?

Dies ist eine einfache Frage, aber ich verstehe sie nicht ... Ich möchte URL in einem String erkennen und durch einen kurzen ersetzen.

Ich habe diesen Ausdruck von stackoverflow gefunden, aber das Ergebnis ist nur http 

Pattern p = Pattern.compile("\\b(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]",Pattern.CASE_INSENSITIVE);
        Matcher m = p.matcher(str);
        boolean result = m.find();
        while (result) {
            for (int i = 1; i <= m.groupCount(); i++) {
                String url=m.group(i);
                str = str.replace(url, shorten(url));
            }
            result = m.find();
        }
        return html;

Gibt es eine bessere Idee?

32
Shisoft

m.group (1) gibt Ihnen die erste übereinstimmende Gruppe, dh die erste erfassende Klammer. Hier ist es (https?|ftp|file)

Sie sollten versuchen zu sehen, ob etwas in m.group (0) vorhanden ist, oder dass Sie Ihr gesamtes Muster in Klammern setzen und m.group (1) erneut verwenden.

Sie müssen Ihre Suchfunktion wiederholen, um mit der nächsten übereinzustimmen, und das neue Gruppenarray verwenden.

7
M'vy

Lassen Sie mich vorgehen und sagen Sie mir, dass ich für komplexe Fälle kein großer Befürworter von Regex bin. Es ist sehr schwierig, für so etwas den perfekten Ausdruck zu schreiben. Das heißt , ich habe zufällig eine URL zum Erkennen von URLs und diese wird durch eine 350-Zeilen-Testfallklasse unterstützt, die bestanden hat. Jemand hat mit einem einfachen Regex begonnen und im Laufe der Jahre haben wir den Ausdruck und die Testfälle erweitert, um die Probleme zu lösen, die wir gefunden haben. Es ist definitiv nicht trivial:

// Pattern for recognizing a URL, based off RFC 3986
private static final Pattern urlPattern = Pattern.compile(
        "(?:^|[\\W])((ht|f)tp(s?):\\/\\/|www\\.)"
                + "(([\\w\\-]+\\.){1,}?([\\w\\-.~]+\\/?)*"
                + "[\\p{Alnum}.,%_=?&#\\-+()\\[\\]\\*[email protected]!:/{};']*)",
        Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);

Hier ist ein Beispiel für die Verwendung:

Matcher matcher = urlPattern.matcher("foo bar http://example.com baz");
while (matcher.find()) {
    int matchStart = matcher.start(1);
    int matchEnd = matcher.end();
    // now you have the offsets of a URL match
}
78
WhiteFang34
/**
 * Returns a list with all links contained in the input
 */
public static List<String> extractUrls(String text)
{
    List<String> containedUrls = new ArrayList<String>();
    String urlRegex = "((https?|ftp|Gopher|telnet|file):((//)|(\\\\))+[\\w\\d:#@%/;$()~_?\\+-=\\\\\\.&]*)";
    Pattern pattern = Pattern.compile(urlRegex, Pattern.CASE_INSENSITIVE);
    Matcher urlMatcher = pattern.matcher(text);

    while (urlMatcher.find())
    {
        containedUrls.add(text.substring(urlMatcher.start(0),
                urlMatcher.end(0)));
    }

    return containedUrls;
}

Beispiel:

List<String> extractedUrls = extractUrls("Welcome to https://stackoverflow.com/ and here is another link http://www.google.com/ \n which is a great search engine");

for (String url : extractedUrls)
{
    System.out.println(url);
}

Drucke:

https://stackoverflow.com/
http://www.google.com/
31
BullyWiiPlaza

Das Erkennen von URLs ist keine leichte Aufgabe. Wenn es genug ist, um eine Zeichenfolge zu erhalten, die mit der https-Datei | ftp | beginnt, könnte dies in Ordnung sein. Ihr Problem hier ist, dass Sie eine Erfassungsgruppe haben, die () und diese nur um den ersten Teil http ...

Ich würde dieses Teil zu einer nicht einfangenden Gruppe machen (? :) und Klammern um die ganze Sache setzen.

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

Mit einigen zusätzlichen Klammern um das Ganze herum (außer Word-Begrenzung beim Start) sollte es mit dem gesamten Domainnamen übereinstimmen:

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

Ich glaube nicht, dass Regex die gesamte URL einnimmt.

2
Billy Moon

Dieses kleine Code-Snippet/diese Funktion extrahiert URL-Strings effektiv aus einem String in Java. Ich habe hier den grundlegenden Regex gefunden und ihn in einer Java-Funktion verwendet.

Ich habe den grundlegenden Regex mit dem Teil "| www [.]" Etwas erweitert, um Links zu fangen, die nicht mit "http: //" beginnen.

Genug geredet (es ist billig), hier der Code:

//Pull all links from the body for easy retrieval
private ArrayList pullLinks(String text) {
ArrayList links = new ArrayList();

String regex = "\\(?\\b(http://|www[.])[-A-Za-z0-9+&amp;@#/%?=~_()|!:,.;]*[-A-Za-z0-9+&amp;@#/%=~_()|]";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(text);
while(m.find()) {
String urlStr = m.group();
if (urlStr.startsWith("(") &amp;&amp; urlStr.endsWith(")"))
{
urlStr = urlStr.substring(1, urlStr.length() - 1);
}
links.add(urlStr);
}
return links;
}
0
lemmy njaria