2013-07-15 11 views
6

Mam następujące wyrażenia regularnego:javascript regex, który pobiera wszystkie subdomeny

[!?\.](.*)\.example\.com 

i ten przykładowy ciąg:

test foo abc.def.example.com bar ghi.jkl.example.com def 

chcę, że produkty RegEx następujące mecze: def.example.com i jkl.example.com. Co muszę zmienić? Powinien działać we wszystkich subdomenach domeny example.com. Jeśli to możliwe, powinien on zajmować tylko pierwszy poziom poddomeny (abc.def.example.com ->def.example.com).

Przetestowano go na regexpal, nie w pełni działa :( Screenshot

+0

Myślę, że miałeś na myśli '(? HamZa

Odpowiedz

3

Tak na marginesie, podczas gdy odpowiedź Hamza za prace dla bieżącej próbki kodu, jeśli trzeba upewnij się, że nazwy domen są również prawidłowe, możesz spróbować zastosować inne podejście, ponieważ [^.\s]+ będzie pasować do znaku ANY, który nie jest spacją lub . (na przykład, że wyrażenie regularne będzie pasować do jk&^%&*(l.example.com jako "poprawnej" subdomeny).

Ponieważ jest dużo mniej ważnych znaków dla wartości nazw domen niż są one nieprawidłowe, można rozważyć zastosowanie podejścia "dodatek" do wyrażenia regularnego, a nie subtraktywnego. Ten wzorzec jest prawdopodobnie tym, którego szukasz w przypadku prawidłowych nazw domen: /(?:[\s.])([a-z0-9][a-z0-9-]+[a-z0-9]\.example\.com)/gi

Złam to trochę więcej. . .

  • (?:[\s.]) - pasuje do przestrzeni lub ., które wyznaczają początek subdomeny poziomu loweset
  • ([a-z0-9][a-z0-9-]+[a-z0-9]\.example\.com) - ten rejestruje grupy liter, cyfr i myślników, że musi się zaczynać i kończyć się od litery lub liczby (reguły nazw domen), a następnie domena example.com.
  • gi - sprawia, że ​​wzór regex chciwy i sprawa niewrażliwe

W tym momencie, to po prostu kwestia chwytając mecze. Od .match() nie gra dobrze z „grupy non-Przechwytywanie” regex, zamiast używać .exec():

var domainString = "test foo abc.def.example.com bar ghi.jkl.example.com def"; 
var regDomainPattern = /(?:[\s.])([a-z0-9][a-z0-9-]+[a-z0-9]\.example\.com)/gi; 
var aMatchedDomainStrings = []; 
var patternMatch; 

// loop through as long as .exec() still gets a match, and take the second index of the result (the one that ignores the non-capturing groups)   
while (null != (patternMatch = regDomainPattern.exec(domainString))) { 
    aMatchedDomainStrings.push(patternMatch[1]); 
} 

W tym momencie aMatchedDomainStrings powinna zawierać wszystkich ważnych, pierwszego stopnia, subdomen.

var domainString = "test foo abc.def.example.com bar ghi.jkl.example.com def"; 

. . . Należy Ci: def.example.com i jkl.example.com, przy czym:

var domainString = "test foo abc.def.example.com bar ghi.jk&^%&*(l.example.com def"; 

. . . powinieneś dostać tylko: def.example.com

+0

Nie chcę zepsuć nastroju, ale zauważ, że nazwy domen wspierają znacznie więcej niż tylko litery, cyfry i łączniki. Poszukaj na przykład tej domeny 'http: // aa®.com', aby nie zapomnieć o nazwach domen UTF8, takich jak' http: // سجل.السعودية': p – HamZa

+1

@HamZa - Nie jestem pewien, czy naprawdę chcemy dostać się do DNS vs. Dyskusja IDNA w sekcji komentarzy tego pytania. :) W końcu jednak i tak nie zmieniłoby to mojego punktu. . . zamiast dopuszczać dowolny znak, z wyjątkiem spacji lub "." (co z pewnością pozwoliłoby na niepoprawne znaki w domenie), jeśli chce dopasować do ważności, będzie musiał zidentyfikować znaki, na które chce zezwolić i odpowiednio skonfigurować dopasowanie wzoru. . . czy chce używać standardów DNS czy IDNA, zależy od niego. ;) – talemyn

8

może użyć następującego wyrażenia:. [^.\s]+\.example\.com

Wyjaśnienie

  • [^.\s]+: pasuje do niczego z wyjątkiem kropki lub białe znaki jeden lub więcej razy
  • \.example\.com: mecz example.com

Należy pamiętać, że nie trzeba uciekać kropkę w klasie znaków

+0

Awesome, thanks! Jak mogę uzyskać wszystkie dopasowania tego wyrażenia regularnego w ciągu znaków za pomocą JavaScript? 'str = 'testuj abc.def.example.com i ghi.jkl.example.com usw.'; str.match ('[^. \ s] + \. example \ .com'); 'pokazuje mi pojedynczy mecz ... – fnkr

+2

@fnkr dodaj flagę' g' (dla globalnych): 'str.match (/ [^. \ s] + \. example \ .com/g) '=> bez cudzysłowów, ale ukośniki i' g' poza ograniczeniem wyrażeń regularnych '/' [takie same reguły dotyczą wymiany podciągów] (http: // stackoverflow .pl/questions/832257/javascript-multiple-replace/9514142 # 9514142) –

+1

@fnkr: 'str.match (/ [^. \ s] + \. example \ .com/g);" zwraca tablicę '[ def.example.com, jkl.example.com] ' –

Powiązane problemy