2017-06-24 1 views
0

j'ai une longue liste de domaines avec des sous-domaines qui ressemblent à:domaines TLD avec Regex lorsque plusieurs sous-domaines

www.random.com 
abc.api.random.co.uk 
abc.def.api.random.ac.za 
something.edu 
another.random.net 
random.pharmacy 

Il y a de 0 à plusieurs sous-domaines sur chaque entrée (par exemple abc.def.api.random.ac.za). J'essaie de comprendre comment je peux extraire juste le domaine et les TLD. Par exemple, étant donné la sortie ci-dessus, je suis à la recherche:

random.com 
random.co.uk 
random.ac.za 
something.edu 
random.net 
random.pharmacy 

Cela va un peu au-delà de ma compréhension actuelle de regex. Il semble que nous devons vérifier:

  • Fin de la ligne est X caractères précédés d'un point (il y a quelques TLDs plus de 3 caractères, à savoir: .pharmacy)
  • Un groupe optionnel avant que cela soit 2 caractères: co, ac etc. (à peu près sûr qu'aucun des domaines de second niveau dans ma liste a plus de 2 caractères - alternatively could build an explicit list of optional second-level domains to be more accurate)
  • la chaîne avant que le domaine est
  • Tout avant qui est sous-domaine et nous ne voulons pas

Répondre

0

Le regex dont vous avez besoin est:

\w+(?:\.\w\w)?\.\w+$ 

étaient:

  • \w+ signifie une ou plusieurs lettres ou chiffres
  • (?:\.\w\w)? est un groupe optionnel qui correspond à une période suivie de deux lettres
  • \.\w+ correspond à une période et les lettres restantes
  • $ est la fin de la ligne

Voir demo.

Si vous voulez être moins générique:

\w+(?:\.(?:co|ac))?\.\w+$ 

Si vous voulez être encore plus précis, vous devez spécifier l'ensemble eTLDs (domaines de haut niveau efficaces) avec des périodes:

\w+(?:\.(?:co\.uk|ac\.za)|\.\w+)$ 

Voir demo.

Si vous voulez connaître tous les domaines de premier niveau, il y a un joli catalogue de la fondation Mozilla nommé Public Suffix List.

0

Juste un peu plus de matière à réflexion.

Vous pouvez faire des répétitions en utilisant * (zéro ou plus) et + (un ou plusieurs), mais vous pouvez également spécifier une plage {x, y} (x ou plus, mais pas plus de y).

Cela peut être utile étant donné que l'avant-dernier domaine fait très probablement partie de votre fichier tld s'il a exactement 2 caractères.

Vous voulez absolument utiliser le marqueur $ (fin de ligne) comme horcrux le fait remarquer, puisque vous travaillerez du côté droit.

\ w +. (\ W {2}.)? \ W +

$ Le (...)? signifie que tout ce qui est dans le groupe de capture est facultatif. Donc, il cherche EXACTEMENT 2 lettres suivies d'une décimale, comme une entrée du milieu optionnelle.