Ich bin ein relativ newb, wenn es um reguläre Ausdrücke kommt, aber ich fange an den Dreh raus zu bekommen. Ich begann eine Methode in Java schreiben eine Zeichenfolge „Linkify“ - das heißt, scannen sie für alle Verweise von URLs (dh „http: // ...“) oder Strings, die wie Web-Adressen ("www aussehen . example.com ... ")Conditional Ersatz mit regex
So zum Beispiel, wenn ich einen String hatte, die wie folgt aussah:
My favorite site is http://www.example.com. What is yours?
Nachdem es durch das Verfahren lief, können Sie eine Zeichenfolge bekommen zurück, die besagten, :
My favorite site is <a href="http://www.example.com">http://www.example.com</a>. What is yours?
Nachdem die Bahn für eine Weile zum Scheuern, war ich endlich in der Lage zusammen Teile Stück von verschiedenen Ausdrücken, die mir helfen, das zu tun, wonach ich suche (Einige Beispiele enthalten abschließende Punkte am Ende von URLs in der tatsächlichen URL, einige codieren URLs bereits in Anker-Tags usw.)
Hier ist, was ich so habe weit:
public static String toLinkifiedString(String s, IAnchorBuilder anchorBuilder)
{
if (IsNullOrEmpty(s))
{
return Empty;
}
String r = "(?<![=\"\"\\/>])(www\\.|(http|https|ftp|news|file)(s)?://)([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?([^.|'|# |!])";
Pattern pattern = Pattern.compile(r, Pattern.DOTALL | Pattern.UNIX_LINES | Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(s);
if (anchorBuilder != null)
{
return matcher.replaceAll(anchorBuilder.createAnchorFromUrl("$0"));
}
return matcher.replaceAll("<a href=\"$0\">$0</a>"); // group 0 is the whole expression
}
public interface IAnchorBuilder
{
public String createAnchorFromUrl(String url);
}
es gibt auch einfache verion von toLinkifiedString, die nur die Zeichenfolge nimmt s - es ruft nur toLinkifiedString (s, null)
So wie ich schon sagte, wird dieses Muster alles kontrollieren Ich brauche es zu fangen und den Ersatz eAll funktioniert gut für jeden Fall, außer wenn ein Link mit www beginnt. Wenn die Übereinstimmung mit "www" statt einem Protokoll wie "http" oder "ftp" beginnt, möchte ich "http: //" vor dem resultierenden Link bedingt voraussetzen. Das heißt:
MyClass.toLinkifiedString("go to www.example.org")
go to <a href="http://www.example.com">www.example.org</a>
Die passenden Gruppen zurückkehren soll, sind wie folgt:
- $ 0 - die tatsächliche URL, die gefunden wird: http://www.example.org oder www.example. net
- $ 1 - das Protokoll Spiel ("http: // "Oder "www" für Links w/o Protokolle)
Ich nehme an, was ich in Pseudo-Code zu tun, in der Lage sein will, ist so etwas wie:
matcher.replaceAll("<a href="(if protocol = "www", insert "http://" + url - otherwise, insert url">url</a>"
Ist das möglich? Oder soll ich einfach nur glücklich sein mit der Lage, nur Anker von Links zu erstellen, die mit „http: // ...“ :)
Vielen Dank für jede Hilfe jedermann
Sie müssen _quite_ nicht so viele Backslashes verwenden. : D –
@ mjd79: Deine Regex ist ziemlich durcheinander. Selbst wenn Sie anfangen, den Dreh raus zu bekommen, sollten Sie keine Beispiele aus dem Internet kopieren, ohne zu verstehen, was sie bedeuten. Ich kann viele falsche Annahmen darin sehen (über das richtige Entweichen von Charakter und über die Mechanik von Charakterklassen). Die Frage, wie man eine URL in einem Text findet, war schon oft da, ich schlage vor, dass du SO mit Google vergleichst. Zumindest die Regexe kommen hier meist mit einer bewiesenen Erklärung. :) – Tomalak