Aide petite regex

eskimo

WRInaute discret
Hello,
Je galère depuis toujours avec les REGEX et je n'arrive pas depuis 30 minutes à trouver la règle pour trouver :
tous les mots commençant par @ et qui ne comprenne pas de .

je suis parti sur quelque chose comme :
\B@\w+


mais je n'arrive pas à exclure les mots avec un . à l'intérieur.

chaîne :
@nicolassss email@ddd.dddd
@rrrrrrrrrr
Edit the Expr@ession

Merci pour votre aide.
 
Dernière édition:

emualliug

WRInaute impliqué
Le problème c'est que le point est lui-même une limite de mot (word boundary), et donc quelques chose comme \B(@\w+)\b ne marchera pas.

Par contre, on peut combiner ça avec un negative lookahead :
Code:
\B(@\w+)(?!\.)\b

Je suis un peu plus circonspect par l'usage de \B, mais je pense que c'est à nouveau parce que @ n'est pas lui-même un caractère de mot.
 

eskimo

WRInaute discret
Salut @emualliug , l'idée c'est d'identifier dans une conversation des users de mon site, comme je viens de le faire à l'instant avec toi.
Ton code fonctionne bien. Merci beaucoup.
Tu es développeur? Ca prends du temps à bien maitriser les regex ?
 

emualliug

WRInaute impliqué
Je me considère plus comme un bidouilleur qu'un développeur.

J'apprécie beaucoup les regex qui sont à la fois puissantes et relativement simples. Il y a quelques subtilités à connaître (notamment les lookahead), mais après on apprend surtout au fur et à mesure et sur le tas, surtout que je suis assez mauvais sur la théorie (faut pas me demander une regex comme ça avec un papier et un stylo).

https://regex101.com/ est vraiment top pour tester ses expressions.

Après, je pense qu'il faut avoir un esprit "tourné" regex, comprendre comment ça fonctionne et comment ça peut être utile (ou pas). On a d'ailleurs vite fait de vouloir faire du "pur regex" là où il faudrait faire autrement. C'est par exemple le cas du traitement d'un HTML, même si pour des traitements simples j'ai tendance à le faire par simplicité (mais c'est pas idéal pour plein de raisons).

La difficulté majeure, c'est donc de comprendre de quel type d'expression tu as besoin pour cibler tous les cas que tu vises sans faux positif.

Par exemple, dans ton cas, la regex telle que tu l'imagines ne convient pas si l'utilisateur est cité à la fin d'une phrase, du genre "c'est un cas classique qu'a déjà rencontré @pinpin."
 

eskimo

WRInaute discret
tu as l'air de kiffer les regex :) et tu dois pas être si mauvais que ça en théorie ( tout est relatif)
J'abuse mais c'est quoi l'utilité de la lettre à la fin comme \b dans
Code:
\B(@\w+)(?!\.)\b
car des fois je vois g ( comme par exemple par défaut dans l'outil que j'utilisais ici https://regexr.com/
T'as un cours qui tient sur 1 feuille A 4sur les regex que tu conseillerais?
 

emualliug

WRInaute impliqué
c'est quoi l'utilité de la lettre à la fin comme \b car des fois je vois g

Alors, pour le coup, c'est pas du tout la même chose. Généralement les caractères après un antislash, du genre \w, \d, \s, etc. représentent soit un caractère spécial (\r pour un retour chariot, \n pour un line break, \t pour une tabulation (de même que \v [espace vertical] et \f [saut de page], mais que je n'ai pas rencontré en pratique), soit une classe de caractères, respectivement [A-Za-z0-9_], [0-9], [\t\r\n\v\f], etc.

\b (et \B) sont un peu spéciaux, ils visent les limites des mots "word boundary", mais ne les englobent pas. Par exemple "\btu" va trouver "tuteur (puisque "tu" est en début de mot) mais non "bitume" ou "battu". De la même manière "tu\b" ne va détecter que "battu". Mais la regex ne retourne pas le caractère qui matérialise la séparation des mots (par exemple l'espace avant "tuteur" ou celui après "battu"). En fait on pourrait d'ailleurs représenter \b et \B comme des look ahead (référence arrière, le terme français m'est revenu).

C'est très différent des caractères g ou m (parfois notés séparément /g ou /m et ensemble /gm), il s'agit là de drapeaux ("flags"), le premier pour indiquer à la regex qu'elle doit être globale (retourner toutes les occurrences et non seulement la première) et la seconde analyser toutes les lignes ensemble (multiline).

Pourquoi "/", et bien il s'agit d'un délimiteur. Dans la notation PCRE, on inscrit l'expression rationnelle à proprement parler entre deux délimiteurs et on la fait suivre des drapeaux, par exemple "/bla/g". Un délimiteur peut être toute caractère non alphanumérique (sauf une espace ou un backslash). / est très largement utilisé, mais on peut lui préférer #, ~, @, %, etc. On choisit généralement un caractère qu'on aura pas besoin d'échapper dans l'expression rationnelle, c'est pour ça que / convient assez bien… sauf pour les recherches dans les chemins d'accès et URL.
 

Discussions similaires

A
Réponses
2
Affichages
3K
Anonymous
A
Haut