J'ai utilisé ce qui suit pour extraire le domaine d'une URL: (ce sont des cas de test) Je peux obtenir les résultats suivants: p> google.com
hopperspot.com
socialrating.it
blogspot.com
xtop10.net
zoyanailpolish.blogspot.com
7 Réponses :
La raison pour laquelle vous voyez zoyanailpolish.blogspot.com code> est que votre regex ne trouve que des chaînes qui commencent em> avec un 'ww'. Ce que vous demandez, c'est que, en plus de supprimer toutes les chaînes qui commencent par un «ww», cela devrait également fonctionner pour une chaîne à partir de «zoyanailpolish» (?). Dans ce cas, utilisez la regex
String Regex = "^ ((WW | Z | A) [A-ZA-Z0-9 -] {0,} \\.)"; Code> Cela supprimera n'importe quel mot qui commence par un "ww" ou "z" ou "a". Personnalisez-le en fonction de ce dont vous avez besoin exactement. P>
Droit. En plus de supprimer toutes les chaînes commençant par un «WW». Il devrait également fonctionner pour une chaîne en commençant par d'autres (non seulement "zoya ongles vernis"). Par exemple, "xyz.blogspot.com".
Mais comme vous l'avez montré pour xtop10.net code> il ne supprime pas
xtop10 code> - de sorte que cela signifie pour certaines chaînes qu'il ne supprime pas - non? La question est - est-ce une liste personnalisée de la chaîne que vous souhaitez ne pas supprimer ou une règle est basée sur laquelle cela fonctionne?
Pour @bhaskar, cela dépend. Par exemple, xtop10.net code>, c'est un site web. C'est un nom de domaine. Je n'ai pas besoin de changer de changement. Tandis que pour
zoyanailpolish.blogspot.com code>, le nom de domaine doit être
blogspot.com code>. Donc, je dois supprimer
zoyanailpolish code>.
Il est très clair ce que @chnet veut: "Droite. Je veux le domaine principal et non les sous-domaines"
@James c'est? Ensuite, il aurait dû dire que, maintenant ne devrait-il pas? J'espère qu'il s'amuse à dire que .com code>,
.co.uk code> et
pvt.k12.wy.us code> tout compte comme le même genre de chose.
@chnet: Honnêtement, si l'obtention du nom de domaine est votre préoccupation, l'utilisation de regex n'est pas la bonne approche imo. Il existe d'autres techniques en Java pour analyser les URL et extraire des noms de domaine.
@Tchrist: Neuvième commentaire ci-dessous la question. J'ai deviné ce qui était nécessaire à partir de la dernière chaîne d'URL. Les chances sont que une regex nécessiterait une expression horrible pour tenir compte de toutes les possibilités afin de poster des solutions alternatives.
Obtenez l'hôte via REGEX est assez compliqué ou impossible car les TLD n'obéissent pas à des règles simples, mais sont fournis par l'ICANN et le changement de temps.
Vous devez utiliser la fonctionnalité fournie par la bibliothèque Java comme ceci: p>
Eh bien, oui, mais il a déjà tout ça. Il veut parfois déplacer parfois un certain nombre d'éléments de premier plan du nom d'hôte Little-Endian, bien qu'il ne nous ait pas dit comment savoir combien d'entre elles pourraient être. Il semble penser que nous pouvons les noms de domaine des yeux et savoir si la partie que nous avons est la partie "principale" déjà ou non. Je ne pense pas que ce soit possible.
Pour le compte rendu, cela ne répond pas à la question. Cela renvoie le nom de domaine fourni, y compris le sous-domaine. L'OP cherchait le nom de domaine "racine" sans sous-domaine, donc si donné "www.google.com", il devrait renvoyer "google.com". Cette méthode renvoie "www.google.com". Cela fonctionne bien si vous essayez simplement d'obtenir le domaine d'une URL avec une chaîne de chemin et / ou de requête.
Comme suggéré par Balusc et d'autres, la solution la plus pratique consisterait à obtenir une liste de TLDS (voir ceci Liste ), enregistrez-les dans un fichier, chargez-les, puis déterminez ce que TLD est utilisé par une chaîne d'URL donnée. À partir de là, vous pouvez constituer le nom de domaine principal comme suit:
String url = "zoyanailpolish.blogspot.com"; String tld = findTLD( url ); // To be implemented. Add to helper class ? url = url.replace( "." + tld,""); int pos = url.lastIndexOf('.'); String mainDomain = ""; if (pos > 0 && pos < url.length() - 1) { mainDomain = url.substring(pos + 1) + "." + tld; } // else: Main domain name comes out empty
Pour @james Poulson, merci. Désolé, quelle est la sortie de votre exemple? Je ne comprends pas vraiment. Il supprimez TLD d'abord, puis ajoutez-le plus tard. Alors, quelle est la sortie finale?
Il n'y a pas de sortie car c'est pseudocode. Une liste de fichiers texte doit être créée (TLDS peut être trouvé sur la liaison Wikipedia), il faut être lu dans une structure de données et la méthode FindTTLD doit être remplie. Si cela est fait correctement, cela devrait faire ce que vous voulez. Dans ce cas donnerait blogspot.com.
à @jams Poulson, à droite. Supposons que je reçois TLD, l'exemple pseudo supprimerait .com code> de l'URL. Ensuite, il se déplace vers la position de point avant
blogspot code>. De cette façon, vous pouvez supprimer
zoyanailpolish code>.
C'est l'idée :) . Si vous rencontrez des problèmes de l'obtenir pour travailler, faites-le-moi savoir.
Ce n'est probablement plus une bonne idée car il y a des milliers de nouveaux TLD à venir dans les prochaines années.
Ceci est 2013 et la solution que j'ai trouvée est simple:
Utilisation de la bibliothèque GUAVA, nous pouvons facilement obtenir un nom de domaine:
InternetDomainName.from(tld).topPrivateDomain()
C'est beaucoup plus simple:
Ce qui se passe avec: www.zoyanailpolish.blogspot.co.uk
InternetDomainName.from("test.blogspot.com").topDomainUnderRegistrySuffix() -> blogspot.com
Il ressemble aux regèges de Cet article pourrait vous aider =)
Alors ne mettez pas ces Woublewoos stupides dans votre motif. Si tout ce que vous voulez, c'est de
S /^[^.]+\.// code>, alors je vous suggère de faire ça.
Pas clair ce que vous voulez, cependant. Essayez-vous de supprimer le premier composant toujours i> ou de tous les composants, mais celui-ci juste avant le TLD ou le premier uniquement lorsqu'il commence par un "WW" ou ....?
Il est non seulement de remplacer "ww". J'ai ajouté un nouvel exemple ci-dessus. Par exemple, "xtop10.net", ce que je veux, c'est: "xtop10.net". Tandis que "zoyanailpolish.blogspot.com" devrait être "blogspot.com"
Pour @tchrist, votre suggestion est une application à Vim, je pense. Mais ce que je veux, c'est différent. Je ne veux pas seulement remplacer le premier "WW". Dans certains cas, par exemple, "xtop10.net". Ce que je veux, c'est "xtop10.net". Mais votre méthode reviendrait "net".
En d'autres termes, vous voulez le domaine principal et non sous-domaines. Correct?
Vous n'avez toujours pas expliqué ce que vous voulez. Maintenant, on dirait que vous devriez simplement vous séparer sur un point et garder les deux derniers éléments retournés.
Que diriez-vous de domaines comme
exemple.tw code> et
exemple.co.uk code>?
à @jams Poulson, à droite. Je veux le domaine principal et non les sous-domaines
@Ballusc, dans vos cas. Je préfère revenir sans modification. Cela dit, il renvoie "exemple.com.tw" et "exemple.co.uk"
N'oubliez pas que '-' et d'autres personnages sont autorisés dans l'URL. (Pensez en dehors de l'ASCII)
Connexes: Stackoverflow.com/cevestions / 3199862 / ... Stackoverflow.com/Questtions/1923815/... Stackoverflow.com/questions/3199343/regex-to-match-Domain-cc TLD
Ne faites pas la voie dure Regex alors. Utiliser Regex pour ce type de problème est ridicule. Split sur DOT dans un tableau. Compter les pièces. Vérifiez si la deuxième dernière partie n'est pas <= 3 caractères et / ou démarrons avec
co code> (il y a probablement d'autres ccTlds que vous souhaitez faire correspondre). Prenez les deux derniers ou trois éléments en fonction du résultat et joignez-les ensemble sur le point à nouveau.
@Ballusc, Droite. Je suis d'accord avec toi. Que voulez-vous dire la deuxième dernière partie n'est pas <= 3? Pourriez-vous expliquer plus?
Balusc fait probablement référence au nombre de caractères de la partie URL. Regex est cool mais vous devriez probablement tomber comme un outil en faveur de quelque chose d'autre si l'expression devient trop complexe.
Comment déterminez-vous si quelque chose est un «domaine principal» ou non?
foo.bar.com code> et
foo.bar.co.uk code> et
foo.bar.pvt.k12.wy.us code> ne regarde pas rien de pareil. Comment déciderez-vous de déposer uniquement le
FOO CODE> mais arrêtez-vous à la barre code> code> dans chacune d'elles, car vous obtenez un nombre différent de points de dos?
à @tchrist, à droite. Je ne suis peut-être pas considéré comme de nombreuses possibilités.