Najkrótsze dopasowanie wyrażenia regularnego w JavaScript


16

Utwórz najkrótsze wyrażenie regularne, które w przybliżeniu będzie pasowało do adresu URL w tekście podczas uruchamiania w JavaScript

Przykład:

"some text exampley.com".match(/your regular expression goes here/);

Wyrażenie regularne musi

  • przechwytuj wszystkie prawidłowe adresy URL, które dotyczą http i https.
  • nie martw się, że nie dopasujesz ciągów szukających adresów URL, które w rzeczywistości nie są poprawnymi adresami URL super.awesome/cool
  • być poprawny, gdy jest uruchamiany jako wyrażenie regularne JavaScript

Kryteria testowe:

Mecz:

Nie pasuje:

  • przykład
  • Super fajne
  • Dzień dobry
  • mogę
  • Witaj.

Oto test, który może trochę wyjaśnić http://jsfiddle.net/MikeGrace/gsJyr/

Przepraszam za brak jasności, nie zdawałem sobie sprawy, jak okropnie pasujące są adresy URL.


Ahgrrrr! Brakuje mi uprawnień do edycji! Mam zamiar ograniczyć grę do jednego języka, być może powinieneś oznaczyć ją tym językiem.
dmckee --- były moderator kociak

Co stanowi prawidłowy znak adresu URL? ponieważ mogę po prostu używać \wdo wszystkiego Czy oczekujesz rereferencji dla różnych składników adresu URL?
Ming-Tang,

1
„URI to ciąg znaków z bardzo ograniczonego zestawu, tj. Litery podstawowego alfabetu łacińskiego, cyfr i kilku znaków specjalnych”, zgodnie z RFC 2396 .
RunnerRick

Mike: Wydaje mi się, że w dalszym ciągu jest trochę wyjaśnienia. W tej chwili mogę po prostu użyć /:/jako wyrażenia regularnego i dopasować prawidłowe URI i nie pasować do wszystkich przykładów z listy »Niezgodne«. Tak długo, jak idziesz tą trasą, pozostaje tylko pytanie: jakie jest najkrótsze wyrażenie regularne, które nie będzie pasowało do żadnego z ciągów przykładowych, ale nadal będzie przechwytywać wszystkie identyfikatory URI.
Joey,

1
Po prostu spróbuj napisać dłuższe wyzwanie z większą ilością szczegółów.

Odpowiedzi:


1
/.+\.\w\w.*/

nie pasuje do 3 łańcuchów, których nie powinien, pasuje do prawie wszystkiego;)
upd: wciąż nie pasuje do wszystkich 5


14

Ten działa:

var re = /(^|\s)((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)/gi;

/*
(^|\s)                            : ensure that we are not matching an url 
                                    embeded in an other string
(https?:\/\/)?                    : the http or https schemes (optional)
[\w-]+(\.[\w-]+)+\.?              : domain name with at least two components;
                                    allows a trailing dot
(:\d+)?                           : the port (optional)
(\/\S*)?                          : the path (optional)
*/

Przechodzi testy na stronie http://jsfiddle.net/9BYdp/1/

Pasuje również:

  • przyklad.com. (kropka końcowa)
  • przyklad.com:8080 (port)

Słodycz!!!!!!!
Mike Grace

2
Czy nie chcesz dopasować nazwy hosta do tylko jednego komponentu (np. Localhost)?
RunnerRick

Pozwala to na spacje
brenjt

pracuje dla mnie. ty :)
STEEL

Działa dobrze, ale nie dla domen z częściami użytkownika / hasła, np.http://user:password@domain.com/path
Radon8472,

5

To oczywiście nie robi tego, co zamierzasz, ale spełnia twoje kryteria:

 /.*/
  • „dopasuj wszystkie prawidłowe adresy URL, które dotyczą http i https”.

    tak, na pewno będzie pasować.

  • „nie przejmuj się niepasowaniem ciągów szukających adresów URL, które w rzeczywistości nie są prawidłowymi adresami URL, takimi jak„ super.awesome / cool ””

    tak, jasne, będzie wiele fałszywych trafień, ale powiedziałeś, że to nie ma znaczenia.

  • być poprawny, gdy jest uruchamiany jako wyrażenie regularne JavaScript

    na pewno jak jajka działają tak, jak mówisz, że powinny.

Jeśli ten wynik NIE jest poprawną odpowiedzią, musisz być bardziej selektywny przy swoich kryteriach.

Aby być regułą, która działa zgodnie z Twoimi intencjami, tak naprawdę postępujesz potrzebę wdrożenia pełnego dopasowywania zgodnego RFC i dopasowujący zgodny pełny RFC będzie „nie martwić się o dopasowanie”.

Tak więc, jeśli chodzi o „pozwolenie na niedopasowanie”, musisz dokładnie określić które odchylenia od RFC są dopuszczalne.

Cokolwiek innego, a całe to ćwiczenie jest fikcją, ponieważ ludzie po prostu napiszą to, co dla nich działa lub jak im się podoba, i poświęcą „mając jakikolwiek sens” na rzecz bycia niskim (jak ja).

Na twojej aktualizacji

Najbardziej naiwnym wyrażeniem regularnym, jakie mogę wymyślić z tymi dopasowaniami (i przechwytuje) wszystkie wklejone do tej pory przykłady:

/(\S+\.[^/\s]+(\/\S+|\/|))/g;

Ma dość prosty charakter i zakłada, że ​​możliwe są tylko 3 podstawowe formy.

x.y
x.y/
x.y/z 

zmoże być niczym innym niż spacją. xmoże być czymkolwiek innym niż spacja. ymoże być wszystkim, co nie jest ani białą spacją, ani znakiem „/”.

Jest wiele rzeczy, które będą obowiązywać dla tej reguły, wiele, ale przynajmniej będą wyglądać jak poprawne URI dla człowieka, po prostu nie będą zgodne ze specyfikacjami.

na przykład:

hello.0/1  # valid 
1.2/1 # valid 
muffins://¥.µ/€  # probably valid

Myślę, że rozsądnym podejściem jest wyodrębnienie rzeczy, które mogą należeć do URI, a następnie zweryfikowanie ich za pomocą czegoś bardziej rygorystycznego. Patrzę, jak wymyślić, jak używać klasy URI przeglądarki do sprawdzania ich poprawności =).

Ale powyższe rozumowanie działa na tym przykładzie tutaj: http://jsfiddle.net/mHbXx/


Zmienił pytanie, ale i tak możesz sobie poradzić /:/nawet po edycji :-)
Joey,

Dzięki Mike =). Nie chcę konkurować w bardziej poważny sposób, inne sugestie są bardziej przydatne, chciałem tylko wskazać problem z początkową przesłanką, aby jakość pytania mogła się poprawić =)
Kent Fredric

Czy to tylko ja, czy to pasuje do „www .google.com”?
Schiavini,

1
/https?\:\/\/\w+((\:\d+)?\/\S*)?/

Spróbuj tego.

Dołączam wiodące i końcowe ukośniki, które ograniczają wyrażenie regularne, więc mam nadzieję, że nie zaszkodzi to mojej liczbie postaci!

Ten wzorzec ogranicza protokół do http lub https, dopuszcza opcjonalny numer portu, a następnie dopuszcza dowolny znak oprócz białych znaków.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.