2016-04-01 11 views
5

Ich benutze eine API, die manchmal Links innerhalb des Textes, die es zurückgibt, und anstelle von "longtexthere https://fancy.link" Ich bekomme "longtexthere https://fa ...".Regex zu Wort (URL) nur wenn es kein Zeichen

Ich versuche, den Link nur zu erhalten, wenn es vollständig ist, oder mit anderen Worten enthält nicht "..." Zeichen.

Bisher bin ich in der Lage, Links zu erhalten, indem die folgende regex:

((?:https?:)?\/\/\S+\/?) 

aber natürlich gibt es jede Verbindung mit fehlerhaften,.

Ich habe versucht, so etwas zu tun:

((?:https?:)?\/\/(?:(?!…)\S)+\/?) 

Obwohl, dass der „...“ Charakter es war immer noch die Rückkehr auf den Link, aber nur ohne einschließlich dem Charakter, so mit dem Fall von "zu ignorieren gestartet https://fa ... "es gab" https://fa "zurück, während ich einfach möchte, dass diese unterbrochene Verbindung ignoriert wird und weitergeht.

Ich kämpfe seit Stunden und kann einfach nicht meinen Kopf herumkommen. :(

Vielen Dank für jede Hilfe im Voraus

+1

Ermöglicht Ihre Regex-Engine Possessivquantifizierer? Versuchen Sie ['(?: Https ?:)? \/\/[^ \ S ...] ++ (?! ...) \ /?'] (Https://regex101.com/r/jQ9lQ2/1) –

+1

Hinweis Sie können auch das '\ /?' am Ende entfernen, da es nie gefunden wird. Wenn Ihr Regex-Geschmack JavaScript oder Python ist, versuchen Sie ['(?! \ S + ...) (?: Https ?:)? \/\/\ S +'] (https://regex101.com/r/jQ9lQ2/2) –

+1

Wenn Possessivquantifizierer und Lookbehind von Ihrem Regexgeschmack unterstützt werden, können Sie auch versuchen, ['(?: Https ?:)? \/\/\ S ++ (?

Antwort

2

können Sie verwenden

(?:https?:)?\/\/[^\s…]++(?!…)\/? 

the regex demo See. Der Possessiv-Quantor [^\s…]++ passt alle Nicht-Whitespace- und Nicht--Zeichen ohne späteres Zurückverfolgen an und überprüft dann, ob das nächste Zeichen nicht ist. Wenn dies der Fall ist, wird keine Übereinstimmung gefunden.

Als Alternative, wenn Ihre Regex-Engine possessive Quantoren ermöglichen, verwenden Sie eine negative lookahead Version:

(?!\S+…)(?:https?:)?\/\/\S+\/? 

another regex demo See. Der Lookahead (?!\S+…) wird die Übereinstimmung fehlschlagen, wenn 1 + non-whitespace Zeichen mit gefolgt werden.

+1

Tut genau das, was ich brauche! Vielen Dank. Erwähnen Sie auch hier @bobblebubble sug gestion von oben: '(?: https?:)? \/\/\ S ++ (? kiradotee

+0

Ja, es ist sehr ähnlich, da es auch Possessivquantifier verwendet, um ein Zurückverfolgen in die Zeichenklasse zu verhindern. '\ S ++' passt alle Nicht-Leerzeichen-Zeichen bis zu einem Leerzeichen oder Ende von Zeichenfolgen an und überprüft dann, ob nur das vorherige Zeichen keine Ellipse war. Wenn dies der Fall ist, ist die Übereinstimmung fehlgeschlagen. –

0

Bitte versuchen Sie es.

https?:\/\/[^ ]*?…|(https?:\/\/[^ ]+\.[^ ]+) 

Hier ist die demo

+0

Könnten Sie sich das bitte ansehen? https://regex101.com/r/uG7cF1/1 – kiradotee

+0

Aktualisiertes Regex-Muster. Bitte schau es dir an. – Quinn

+0

Entschuldigen Sie die Störung, aber könnten Sie das bitte sehen? https://regex101.com/r/iB3tK6/1 – kiradotee

1

Versuchen:.

((?:https?:)?\/\/\S+[^ \.]{3}\/?) 

Es ist die gleiche wie Ihre Original-Muster .. Sie sagen nur, dass die letzten drei Zeichen nicht "." sein sollten oder '' (Leerzeichen)

UPDATE: Ihr zweiter Link funktioniert.

und wenn Sie Ihre regex zwicken nur leicht wird es tun, was Sie wollen:

((?:https?:)?\/\/\S+[^ …] \/?) 

Ja, es sieht genauso aus wie das, was du da drin hatte, außer ich einen ‚‘ (Leerzeichen) nach dem Teil fügten wir tun nicht wollen .. das zwingt den regulären Ausdruck, bis zu und einschließlich des Raumes, den es nicht mit einer URL, die das '...' Zeichen hat, zu schließen. Ohne den Raum am Ende würde es passen, bis die nicht mit der ‚...‘ das war, warum es nicht tat, was wir wollten;)

+0

Ich habe deine Datei leicht modifiziert (weil es ein Sonderzeichen ist anstatt drei Punkte), obwohl es den Trick https://regex101.com/r/zJ7lM0/1 – kiradotee

+0

aus irgendeinem Grund nicht gemacht hat, ist die URL, die du hast, blockiert für mich. :( – Rob

+0

Huh, du bist die erste Person, die Regex101.com nicht öffnen konnte. Vielleicht funktioniert dieser Link? Http://regexr.com/3d53k – kiradotee

1

Sie versuchen, können folgende regex

https?:\/\/\w+(?:\.\w+\/?)+(?!\.{3})(\s|$) 

Siehe Demo https://regex101.com/r/bS6tT5/3

+0

Könnten Sie sich bitte dieses Beispiel ansehen? https://regex101.com/r/bS6tT5/1 – kiradotee

+0

sicher, siehe https://regex101.com/r/bS6tT5/2. Ich habe Regex geändert. – Saleem

+0

Aber das wählt nur http://google.com und https://google.com? – kiradotee

Verwandte Themen