Cela ressemble à un bon ajustement pour les expressions régulières. Il y a plusieurs façons de résoudre cela.
Voici la plus simple:
(?<mention>@[a-zA-Z0-9_.]+)[^a-zA-Z0-9_.]
- il recherche les caractères correspondant suivi par le caractère non congruente.
[^ ... ]
le bit de négation
(?<mention> ...)
déclare un groupe explictit pour capturer la mention sans inclure le caractère non-concordant immédiatement après la mention.
- pas que ce motif nécessite un caractère non-concordant après la mention, donc si cela importe de contourner cela.
Un modèle propre utiliseraient une fonctionnalité appelée look-ahead: (!)
@[a-zA-Z0-9_.]+?(?![a-zA-Z0-9_.])
- est négatif préanalyse. Signification "ne correspond que si elle n'est PAS suivie par ceci"
- La capture nommée n'est pas nécessaire car la fonction de lecture anticipée ne consomme pas la partie lookahead.
- Il prend en charge les recherches de plusieurs mentions en ajoutant un quantificateur non gourmand
+?
. Cela garantit que la mention correspondante est aussi courte que possible.
Lookaheads sont un peu moins connus et peuvent devenir une douleur à lire si le modèle se développe trop longtemps. Mais c'est un outil utile à savoir.
Exemple complet utilisant C#:
string comment = "hi @fri.tara3^ @hjh not a mention @someone";
const String pattern = "@[a-zA-Z0-9_.]+?(?![a-zA-Z0-9_.])";
var matches = Regex.Matches(comment, pattern);
for (int i = 0; i < matches.Count; i++)
{
Console.WriteLine(matches[i].Value);
}
Vous savez déjà que vous pouvez utiliser regex pour cela. Y a-t-il une question quelque part? Où êtes-vous resté coincé? –
Il est vraiment difficile de trouver le dernier index de ** pas @ "^ [a-zA-Z0-9 _,] + $" **, je ne sais pas ce que je dois faire – ara
@ara: qu'en est-il de ['@" @ \ S + \ b "'] (https://regex101.com/r/uH3wA3/1)? –