web-dev-qa-db-fra.com

Expression régulière pour correspondre à #hashtag mais pas #hashtag; (avec point-virgule)

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é.

5
Wex

Que diriez-vous de ce qui suit:

\B(\#[a-zA-Z]+\b)(?!;)

Demo Regex

  • \ B -> Pas une limite de mot
  • (# [a-zA-Z] +\b) -> Groupe de capture commençant par # suivi d'un nombre quelconque de a-z ou A-Z avec une limite de mot à la fin
  • (?!;) -> Non suivi de;
11
tk78

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 suivante

Démo RegEx

4
anubhava

Similaire à 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(?!;)

Démo de Regex101

1
garyh