J'ai l'expression régulière actuelle:
/(?<=[\s>]|^)#(\w*[A-Za-z_]+\w*)/g
Que je teste contre la chaîne:
Here's a #hashtag and here is #not_a_tag; which should be different. Also testing: Mid#hash. #123 #!@£ and <p>#hash</p>
Pour mes besoins, il ne devrait y avoir que deux hashtags détectés dans cette chaîne. Je me demande comment modifier l'expression de sorte qu'elle ne - soit pas correspond aux hashtags qui se terminent par un ;
dans mon exemple, il s'agit de #not_a_tag;
À votre santé.
Que diriez-vous de ce qui suit:
\B(\#[a-zA-Z]+\b)(?!;)
Vous pouvez utiliser un reegex négatif:
/(?<=[\s>]|^)#(\w*[A-Za-z_]+\w*)\b(?!;)/
\b
- La limite de mot garantit que nous sommes à la fin de Word(?!;)
- affirme que nous n'avons pas de point-virgule à la position suivanteSimilaire à la réponse de anubhava, mais permutez les 2 instances de \w*
avec \d*
car la seule différence entre \w
et [A-Za-z_]
correspond aux caractères 0-9
.
Cela a pour effet de réduire le nombre d'étapes de 588 à 90
(?<=[\s>])#(\d*[A-Za-z_]+\d*)\b(?!;)