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: p>
Ceci est un événement #awesome, utilise le tag #fun p> blockQuote>
J'utilise le framework .NET (C #), je pensais que ce serait un modèle de regex approprié à utiliser: p>
# \ w + p>
est-ce la meilleure regex à cet effet? P>
9 Réponses :
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 + code> correspondra dans ces deux cas. Si vous modifiez légèrement votre regex à
\ b # \ w \ w + code>, vous pouvez éliminer ces cas et ne correspondez que des hashtags de longueur supérieure à 1 sur des limites de mots. P>
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 [^..,) \]}] Code> serait un meilleur choix. Mais cela nécessite toujours un caractère de mot (lettre / numéro, IIRC) au début pour
\ b code> 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 # code> ne correspondra que si le
# code> est b> immédiatement précédé d'un caractère de mot. Si quelque chose, vous voulez le contraire:
\ b # code> (
\ b code> == "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 + ' code>.
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.
Ceci est celui que j'ai écrit il cherche des limites de mots et ne correspond que le texte hachage (? <= #) \ w *? (? = \ w) p>.
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: p>
\ b # \ w * [a-za-z] + \ w * p>
Votre cas ne supporte pas # ONETAG # SECONDTAG. Cela ne devrait pas être un hashtag.
J'ai testé des tweets et j'ai réalisé que les hashtags:
Donc, c'est ce que j'ai: p>
Cela correspondra à "& # foobar" que Twitter ne considère pas comme un hashtag.
et ne correspond pas à une certaine langue, comme # Déjà
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*)
C'est une bien meilleure solution au problème donné.
Existe-t-il une raison particulière d'utiliser (?: (? <= \ S) | ^) code> au lieu de
(? <= \ S | ^) code>?
@ 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.
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 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 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 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]*)
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 A > Fichier autour de la ligne 120.
@ Αλεχει - merci! J'ai mis à jour les liens dans la réponse avec les derniers que vous avez fournis.
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_]*)
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 ō.