2016-04-01 23 views
5

karakterini içermeyen bir API kullanıyorum, bazen döndürdüğü metnin içindeki bağlantılar kesiliyor ve "longtexthere https://fancy.link" yerine "longtexthere https://fa…".regex word (url) ile eşleşmesi için karakter içermiyorsa yalnızca

Bağlantı, yalnızca tamamlanmışsa veya başka bir deyişle "…" karakteri içermiyorsa eşleştirmeye çalışıyorum.

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

ama belli kırık olanlar dahil her bağlantıyı verir:

Şimdiye kadar aşağıdaki regex kullanarak link almak mümkün. bu sadece karakteri dahil etmeden hala ama linki dönüyordu "..." karakterini görmezden başlamasına rağmen "söz ile, böylece

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

:

Böyle bir şey yapmaya çalıştık https://fa… "https://fa'u geri gönderdi", ancak sadece bu bozuk bağlantıyı yok saymasını ve devam etmesini istiyorum.

Bunu saatlerce kavradım ve başım ağrıyor. Önceden herhangi bir yardım için :(

Teşekkür

+1

Regex motorunuz sahip olunan niceleyicilere izin veriyor mu? ['(?: https ?:)? \/\/[^ \ S…] ++ (?!…) \ /?'] 'I deneyin (https://regex101.com/r/jQ9lQ2/1) –

+1

Not Ayrıca, her zaman eşleşmeyecek şekilde '\ /?' de kaldırabilirsiniz. Normal ifadeniz JavaScript veya Python ise, ['(?! \ S +…) (?: https ?:)? \/\/\ S +'] 'yi deneyin (https://regex101.com/r/jQ9lQ2/2) –

+1

İntikam lezzetlendiriciniz tarafından iyelik kantitatif ve görünüm destekleniyorsa, aynı zamanda ['(?: Https ?:)? \/\/\ S ++ (?

cevap

2

Sen

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

the regex demo Bkz kullanabilirsiniz. İyelik niceleyicisi [^\s…]++, daha sonra tekrar izlemeye gerek duymadan tüm beyaz olmayan ve karakterleri ile eşleşecek ve sonraki karakterin olmadığını kontrol edecektir. Öyleyse, hiçbir eşleşme bulunamaz.

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

another regex demo görme: regex motoru iyelik nicelik izin verirse

alternatif olarak, bir negative lookahead sürümünü kullanın. (?!\S+…) lookahead, 1 + olmayan boşluk karakterleri ile izleniyorsa eşleşme başarısız olur.

+1

Tam olarak ihtiyacım olan şey! Teşekkürler çok teşekkürler Ayrıca burada @bobblebubble sug bahseder yukarıdan gelen jest: '(?: https ?:)? \/\/\ S ++ (? kiradotee

+0

Evet, karakter sınıfına geri dönüşü engellemek için iyelik belirleyici kullanması da çok benzer. '\ S ++', herhangi bir boşluk olmayan karakterle, bir boşluk veya dize sonuna kadar eşleşir ve daha sonra yalnızca önceki karakterin bir elips olmadığını kontrol eder. Öyleyse, eşleşme başarısız. –

0

deneyin. Burada

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

demo olduğunu

+0

Şuna bakar mısınız lütfen? https://regex101.com/r/uG7cF1/1 – kiradotee

+0

Güncellenmiş normal desen. Lütfen kontrol et. – Quinn

+0

Tekrar rahatsız ettiğim için üzgünüm, ama şuna bakar mısınız lütfen? https://regex101.com/r/iB3tK6/1 – kiradotee

1

Dene:. olarak

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

Its aynı senin orijinal desen .. sadece son üç karakterin '.' (dönem) olmaması gerektiğini söylüyorsunuz veya '' (boşluk)

UPDATE: İkinci bağlantınız çalıştı.

ve sadece hafifçe regex çimdik eğer ne istediğinizi yapacak:

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

Evet bu sadece yapmamız parçası sonra '' (boşluk) ilave dışında Oraya ne vardı benziyor

istemiyorum .. bu normal ifadeyi '...' karakterine sahip bir url ile yapamayacağı alana kadar eşleşmeye zorlar. sonunda uzayda olmadan dahil değil kadar eşleşir '...' ne istedik yapmıyordu neden olan;)

+0

Sizinkileri biraz değiştirdim (çünkü üç noktadan ziyade özel bir karakter olduğu için), bir sebepten dolayı https://regex101.com/r/zJ7lM0/1 – kiradotee

+0

hile yapmamış olsanız bile benim için. :( – Rob

+0

Huh, regex101.com'u açamayan ilk kişi siz misiniz? Belki bu bağlantı işe yarayacak? Http://regexr.com/3d53k – kiradotee

1

Sen regex

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

Bkz demo aşağıdaki deneyebilirsiniz https://regex101.com/r/bS6tT5/3

+0

Bu örneğe bakar mısınız lütfen? https://regex101.com/r/bS6tT5/1 – kiradotee

+0

emin olun, bkz. https://regex101.com/r/bS6tT5/2 Düzenli ifadelerim var – Saleem

+0

Ancak bu sadece http://google.com ve https://google.com? – kiradotee

İlgili konular