2013-07-15 17 views
6

ho la seguente espressione regolare:javascript regex che ottiene tutti i sottodomini

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

e questa stringa di esempio:

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

voglio che i prodotti RegEx i seguenti incontri: def.example.com e jkl.example.com. Cosa devo cambiare? Dovrebbe funzionare su tutti i sottodomini di example.com. Se possibile, dovrebbe prendere solo il primo livello di sottodominio (abc.def.example.com ->def.example.com).

provato su regexpal, non completamente funzionante :( Screenshot

+0

Penso che intendessi '(? HamZa

risposta

3

solo su un lato nota, mentre la risposta di Hamza funziona per il vostro codice di esempio corrente, se è necessario assicurarsi che i nomi di dominio siano validi, potresti provare un approccio diverso, poiché [^.\s]+ corrisponderà a ANY carattere che non è uno spazio o . (ad esempio, che un'espressione regolare corrisponderà a jk&^%&*(l.example.com come sottodominio "valido").

Poiché ci sono molti meno caratteri validi per i valori dei nomi di dominio rispetto a quelli non validi, si potrebbe considerare l'utilizzo di un approccio "additivo" alla regex, piuttosto che sottrattivo. Questo schema è probabilmente quello che stai cercando per nomi di dominio validi: /(?:[\s.])([a-z0-9][a-z0-9-]+[a-z0-9]\.example\.com)/gi

Per abbattere un po 'di più. . .

  • (?:[\s.]) - corrisponde lo spazio o . che avrebbe segnato l'inizio del sottodominio di livello loweset
  • ([a-z0-9][a-z0-9-]+[a-z0-9]\.example\.com) - questa cattura un gruppo di lettere, numeri o trattini, che deve iniziare e finire con una lettera o un numero (regole nome dominio) e quindi il dominio example.com.
  • gi - rende il modello regex avido e case insensitive

A questo punto, è semplicemente una questione di afferrare le partite. Dal momento che .match() non gioca bene con i "gruppi non-cattura" l'espressione regolare, utilizzare .exec() invece:

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]); 
} 

A quel punto aMatchedDomainStrings dovrebbe contenere tutte le vostre valide, di primo livello, sotto-domini.

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

. . . dovrebbe farti: def.example.com e jkl.example.com, mentre:

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

. . . dovresti prenderti solo: def.example.com

+0

Non voglio rovinare l'umore, ma nota che i nomi di dominio supportano molto più di solo lettere, cifre e trattini. Cerca ad esempio questo dominio 'http: // aa®.com', per non dimenticare nomi di dominio UTF8 come' http: // سجل.السعودية': p – HamZa

+1

@HamZa - Non siamo sicuri di voler davvero entrare in un DNS vs. Discussione IDNA nella sezione commenti di questa domanda. :) Alla fine, comunque, non cambierebbe comunque il mio punto. . . piuttosto che consentire a qualsiasi carattere tranne uno spazio o '.' (che consentirebbe sicuramente caratteri di dominio non validi), se vuole corrispondere per la validità, dovrà identificare i caratteri che desidera consentire e impostare la corrispondenza del modello di conseguenza. . . se vuole usare gli standard DNS o IDNA dipende da lui. ;) – talemyn

8

si può utilizzare la seguente espressione:. [^.\s]+\.example\.com

Spiegazione

  • [^.\s]+: abbinare nulla, tranne un punto o spazio bianco una o più volte
  • \.example\.com: abbinare example.com

Si noti che non è necessario per sfuggire un punto in una classe di caratteri

+0

Fantastico, grazie! Come posso ottenere tutte le corrispondenze di questa regex in una stringa tramite JavaScript? 'str = 'prova abc.def.example.com e ghi.jkl.example.com usw.'; str.match ('[^. \ s] + \. example \ .com'); 'mi mostra una singola corrispondenza ... – fnkr

+2

@fnkr aggiungi un flag' g' (per global): 'str.match (/ [^. \ s] + \. example \ .com/g) '=> Nessuna virgolette, ma barre e una' g' al di fuori della regex delimitando '/' [le stesse regole si applicano alla sostituzione delle sottostringhe] (http: // stackoverflow .com/questions/832257/javascript-multiple-replace/9514142 # 9514142) –

+1

@fnkr: 'str.match (/ [^. \ s] + \. example \ .com/g);' restituisce un array '[ def.example.com, jkl.example.com] ' –

Problemi correlati