javascript regex que obtiene todos los subdominios

Tengo el siguiente RegEx:

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

y esta cadena de muestra:

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

Quiero que los productos RegEx def.example.com las siguientes coincidencias: def.example.com y jkl.example.com . ¿Qué tengo que cambiar? Debería estar trabajando en todos los subdominios de example.com. Si es posible, solo debe tomar el primer nivel de subdominio ( abc.def.example.com -> def.example.com ).

Probado en regexpal , que no funciona por completo ­čÖü Captura de pantalla

En una nota lateral, mientras que la respuesta de HamZa funciona para su código de muestra actual, si necesita asegurarse de que los nombres de dominio también son válidos, puede intentar un enfoque diferente, ya que [^.\s]+ coincidirá con CUALQUIER personaje que no es un espacio o a . (por ejemplo, esa expresión regular coincidirá con jk&^%&*(l.example.com como un subdominio "válido").

Como hay muchos less caracteres válidos para los valores de nombre de dominio que los no válidos, puede considerar usar un enfoque "aditivo" para la expresión regular, en lugar de sustractivo. Este patrón aquí es probablemente el que está buscando para nombres de dominio válidos: /(?:[\s.])([a-z0-9][a-z0-9-]+[a-z0-9]\.example\.com)/gi

Para descomponerlo un poco más. . .

  • (?:[\s.]) – coincide con el espacio o . eso marcaría el comienzo del subdominio del nivel loweset
  • ([a-z0-9][a-z0-9-]+[a-z0-9]\.example\.com) – esto captura un grupo de letras, numbers o guiones, que deben comenzar y terminar con un letra o un número (reglas de nombre de dominio), y luego el dominio example.com .
  • gi : hace que el patrón de expresiones regulares sea codicioso e insensible a las mayúsculas y minúsculas

En este punto, simplemente es cuestión de agarrar las cerillas. Como .match() no funciona bien con la expresión regular "grupos que no capturan", use .exec() lugar:

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

En ese punto aMatchedDomainStrings debe contener todos sus subdominios de primer nivel válidos.

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

. . . debería conseguirte: def.example.com y jkl.example.com , mientras:

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

. . . debería conseguirte solo: def.example.com

Puede usar la siguiente expresión: [^.\s]+\.example\.com .

Explicación

  • [^.\s]+ : hace coincidir cualquier cosa excepto un punto o espacio en blanco una o más veces
  • \.example\.com : match example.com

Tenga en count que no necesita escaping de un punto en una class de personaje