2016-07-21 1 views
3

J'ai l'expression régulière actuelle:Expression régulière correspondant à #hashtag mais pas à #hashtag; (Avec virgule)

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

qui 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 #[email protected]£ and <p>#hash</p> 

Pour mes fins, il ne devrait y avoir deux hashtags détectés dans cette chaîne. Je me demande comment modifier l'expression telle qu'elle ne pas hashtags match qui se terminent par un ; dans mon exemple c'est #not_a_tag;

Vive.

Répondre

5

Que diriez-vous les éléments suivants:

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

Regex Demo

  • \ B -> Pas limite de mot
  • (# [a-zA-Z] + \ b) -> Capturer à partir du groupe aveC# suivi de tout nombre de az ou AZ avec une limite de mot à la fin
  • (?!;) -> Non suivi par;
+4

Voulez-vous dire' \ B'? '\ W 'a besoin d'un caractère réel avant le' # '. –

+0

Réponse acceptée pour les moindres étapes. \ B est probablement ce que je vais utiliser. – Wex

+0

@TimPietzcker Vous avez raison. Post édité. – tk78

4

Vous pouvez utiliser un test avant négatif reegex:

/(?<=[\s>]|^)#(\w*[A-Za-z_]+\w*)\b(?!;)/ 
  • \b - limite de mot assure que nous sommes à la fin du mot
  • (?!;) - affirme que nous n'avons pas point-virgule à la prochaine Position

RegEx Demo

+0

Pour les performances '\ B # (\ d * [A-Za-z _] + \ w *) \ b (?!;)' Devrait être votre regex. '# [a-zA-Z] +' ne correspondra pas '# 123hashtag' – anubhava

1

similaires à la réponse de anubhava mais échanger les 2 cas de \w* avec \d* que la seule différence entre \w et [A-Za-z_] est le 0-9 caractères

Cela a pour effet de réduire le nombre d'étapes 588-90

(?<=[\s>])#(\d*[A-Za-z_]+\d*)\b(?!;)

Regex101 demo