2016-05-14 1 views
-1

J'ai besoin de savoir comment fonctionne la mention, comment trouver des mentions au cours d'un texte. sont nous devons trouver d'abord '@' et dernier pas @ "^ [a-zA-Z0-9 _,] + $"Comment @mention fonctionne, comment puis-je trouver mention au cours de commentaire dans .Net

Merci de partager votre expérience

string comment=" hi @fri.tara3^"; 
mention is : "@fri.tara3" 
+1

Vous savez déjà que vous pouvez utiliser regex pour cela. Y a-t-il une question quelque part? Où êtes-vous resté coincé? –

+0

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

+0

@ara: qu'en est-il de ['@" @ \ S + \ b "'] (https://regex101.com/r/uH3wA3/1)? –

Répondre

2

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); 
} 
+0

merci, que diriez-vous de trouver multi @ comme '" hi @ fri.tara3^@hjh "' suis-je obligé d'utiliser quelque chose comme ceci: 'comment = commentaire.Substring (indexofLastFind, ...)' – ara

+0

Regex peut tout trouver correspond pour vous en un seul passage. Voir l'exemple mis à jour en réponse. –

+0

vous êtes magique, incroyable! Merci merci beaucoup :* – ara