12
votes

Meilleure Hashtag Regex

J'essaie de trouver toutes les balises de hasch dans une chaîne. Les hashtags proviennent d'un flux comme Twitter, ils pourraient être n'importe où dans le texte comme:

Ceci est un événement #awesome, utilise le tag #fun

J'utilise le framework .NET (C #), je pensais que ce serait un modèle de regex approprié à utiliser:

# \ w +

est-ce la meilleure regex à cet effet?


0 commentaires

9 Réponses :


11
votes

Cela dépend de la question de savoir si vous voulez faire correspondre des hashtags à l'intérieur d'autres cordes («Quelques mots») ou des choses qui ne sont probablement pas des hashtags («nous sommes n ° 1»). La regex que vous avez donnée # \ w + correspondra dans ces deux cas. Si vous modifiez légèrement votre regex à \ b # \ w \ w + , vous pouvez éliminer ces cas et ne correspondez que des hashtags de longueur supérieure à 1 sur des limites de mots.


7 commentaires

Merci d'cela, j'étais un peu inquiet que les cas de bord me causaient du chagrin.


Une autre note, cette regex ne correspond pas à "# Tags-with-Hoishens", alors gardez cela à l'esprit ...


Peut-être que \ b [^..,) \]}] serait un meilleur choix. Mais cela nécessite toujours un caractère de mot (lettre / numéro, IIRC) au début pour \ b fonctionner. Je n'ai absolument aucune idée de la façon dont les "hashtags" sont utilisés sur Twitter, cependant. Pourrait être que je me trompe gravement ici et qu'ils incluent régulièrement la ponctuation à l'exception des traits d'union.


\ b # ne correspondra que si le # est immédiatement précédé d'un caractère de mot. Si quelque chose, vous voulez le contraire: \ b # ( \ b == "une position qui n'est pas une limite de mot").


Tache sur @alan Moore. La réponse marquée correcte ici n'est pas réellement correcte, il devrait être \ b # \ w \ w \ w + '.


J'utilise celui-ci pour faire correspondre des mots avec des accents (vous pouvez ajouter tout autre signe dont vous avez besoin): \ B # ([\ wàêtëéèîïcûùüç] +)


Modifier la réponse pour refléter les commentaires, la mise en œuvre vérifiée. Merci à Alan-Moore.



0
votes

Ceci est celui que j'ai écrit il cherche des limites de mots et ne correspond que le texte hachage (? <= #) \ w *? (? = \ w) .


0 commentaires

4
votes

J'ai tweeté une chaîne avec des étiquettes de hachage placées au hasard, a vu ce que Twitter a fait avec elle, puis essayé de le faire correspondre avec une expression régulière. Voici ce que j'ai eu:

\ b # \ w * [a-za-z] + \ w *

#face #fa ! Ce quelque chose #iam # 1 # 1 # 919 #jifdosaj Somethine # Idfsjoa 9 # 9 # 98 9 # 9f9j # 9F9J # 9Jlasdjl # jklfdsajl34 # 34239 #jkf #a * # 1J3RJ3


1 commentaires

Votre cas ne supporte pas # ONETAG # SECONDTAG. Cela ne devrait pas être un hashtag.



-1
votes

J'ai testé des tweets et j'ai réalisé que les hashtags:

  • sont composés de caractères alphanumériques plus un soulignement.
  • doit avoir au moins une lettre ou un soulignement.
  • peut avoir le caractère de points, mais le hashtag sera interprété comme un lien vers un site externe. (Je ne considère pas cela)

    Donc, c'est ce que j'ai: xxx


2 commentaires

Cela correspondra à "& # foobar" que Twitter ne considère pas comme un hashtag.


et ne correspond pas à une certaine langue, comme # Déjà



29
votes

Après avoir regardé les réponses précédentes ici et faire des tweets de test pour voir ce que Twitter aimait, je pense que je suis arrivé à une expression régulière solide qui devrait faire l'affaire. Il nécessite une fonctionnalité recherchée sur le moteur d'expression régulier. Il peut donc ne pas fonctionner avec tous les moteurs là-bas. Il devrait toujours fonctionner bien pour .NET et PCRE.

(?<=\s|^)#(\w*[A-Za-z_]+\w*)


5 commentaires

C'est une bien meilleure solution au problème donné.


Existe-t-il une raison particulière d'utiliser (?: (? <= \ S) | ^) au lieu de (? <= \ S | ^) ?


@ zéro323 pas que je puisse me souvenir, non. J'ai écrit cela tout en apprenant des expressions régulières afin que j'aurais pu être trop verbeuse lorsque je n'avais pas besoin de.


Merci pour la réponse @KevinMark.


@ zero323 mon plaisir.



39
votes

Si vous tirez des statuts contenant des hashtags de Twitter, vous n'avez plus besoin de les trouver vous-même. Vous pouvez désormais spécifier le paramètre INSPARY_ENT_ENTITES STRT> pour que Twitter appelle automatiquement les mentions, les liens et les hashtags.

Par exemple, prenez l'appel suivant sur Status / Afficher : P>

http://api.twitter.com/1/status/show/60183527282577408.json?include_entalities=true

dans le JSON résultant, remarquez les entités strud> objet. p> xxx pré>

Vous pouvez utiliser ce qui précède pour localiser les entités spécifiques de la Tweet (qui se produit entre les positions de cordes indiquées par les indices forts> la propriété) et transformez-les de manière appropriée. P>

Si vous avez juste besoin de l'expression régulière pour localiser les hashtags, Twitter les fournit dans un Open Source Library . P>

Modèle de correspondance HASHTAG H2>
(^|[^&\p{L}\p{M}\p{Nd}_\u200c\u200d\ua67e\u05be\u05f3\u05f4\u309b\u309c\u30a0\u30fb\u3003\u0f0b\u0f0c\u00b7])(#|\uFF03)(?!\uFE0F|\u20E3)([\p{L}\p{M}\p{Nd}_\u200c\u200d\ua67e\u05be\u05f3\u05f4\u309b\u309c\u30a0\u30fb\u3003\u0f0b\u0f0c\u00b7]*[\p{L}\p{M}][\p{L}\p{M}\p{Nd}_\u200c\u200d\ua67e\u05be\u05f3\u05f4\u309b\u309c\u30a0\u30fb\u3003\u0f0b\u0f0c\u00b7]*)


3 commentaires

Le lien vers la page d'ingénierie Twitter est cassé.


Le modèle ci-dessus peut être reconstitué de Ce fichier java. Les tests de validation de ce modèle sont situés dans Ceci Fichier autour de la ligne 120.


@ Αλεχει - merci! J'ai mis à jour les liens dans la réponse avec les derniers que vous avez fournis.



1
votes

Autant que je puisse dire, ce modèle fonctionne le mieux. Les autres ont affiché ici ne prennent pas en compte qu'un hashtag commençant par des chiffres n'est pas valide. Veuillez vous assurer que vous utilisez uniquement le deuxième groupe de capture lorsque vous extrayez le hashtag.

(^|\s)#([A-Za-z_][A-Za-z0-9_]*)


2 commentaires

J'ai eu la chance de voter ceci pour ne pas avoir besoin d'appartements et d'être assez droit sur le match de modèle.


Cela ne va pas attraper des caractères étendus tels que Ñ et ō.




0
votes

/ # ((\ w | [\ u00c0- \ uffdf]) +) / g

Référence: Table Unicode


0 commentaires