2009-03-10 5 views
19

Disons que j'ai la chaîne "Nom d'utilisateur: prénom.nom" contenue dans une chaîne plus grande. Comment puis-je utiliser une expression régulière pour obtenir la partie prénom.nom?Renvoyer uniquement une partie de l'expression régulière

Chaque méthode que j'ai essayé retourne la chaîne "Nom d'utilisateur: prénom.nom" puis je dois faire une chaîne de remplacer sur "Nom d'utilisateur:" à une chaîne vide.

Les références bibliographiques peuvent être utilisées ici?

Edit:

La chaîne peut contenir plus « Nom du compte: prénom.nom » donc pourquoi je veux faire correspondre le « Nom d'utilisateur: » une partie de la chaîne aswell juste obtenir cette valeur.

Répondre

31

J'aime utiliser des groupes nommés:

Match m = Regex.Match("User Name:first.sur", @"User Name:(?<name>\w+\.\w+)"); 
if(m.Success) 
{ 
    string name = m.Groups["name"].Value; 
} 

Apposer l'?<something> au début d'un groupe entre parenthèses (par exemple (?<something>...)) vous permet d'obtenir la valeur du match en utilisant something comme une clé (par exemple à partir m.Groups["something"].Value)

Si vous ne voulez pas aller à la peine de nommer vos groupes, vous pourriez dire

Match m = Regex.Match("User Name:first.sur", @"User Name:(\w+\.\w+)"); 
if(m.Success) 
{ 
    string name = m.Groups[1].Value; 
} 

et juste obtenir la première chose qui correspond. (Notez que le premier groupe parenthésé est à l'index 1; l'expression entière qui correspond est à l'index 0)

+1

qui est grand, merci beaucoup. –

2

Toutes les bibliothèques d'expressions régulières que j'ai utilisées vous permettent de définir des groupes dans l'expression régulière en utilisant des parenthèses, puis accédez à ce groupe à partir du résultat.

Ainsi, votre regexp pourrait ressembler à: Nom d'utilisateur: (. [. ^] [. ^])

Le match complet est un groupe 0. La partie qui correspond à l'intérieur des parenthèses est un groupe 1.

2

faire un groupe avec paranthèses, puis obtenir de la collection Match.Groups, comme ceci:

string s = "User Name:firstname.surname"; 
Regex re = new Regex(@"User Name:(.*\..*)"); 
Match match = re.Match(s); 
if (match.Success) 
{ 
    MessageBox.Show(match.Groups[1].Value); 
} 

(note: le premier groupe, avec un indice 0, est tout le match)

6

Vous COU ld essaie aussi le concept de "lookaround". Il s'agit d'une sorte d'assertion de largeur nulle, ce qui signifie qu'elle va correspondre aux caractères mais ne les capturera pas dans le résultat. Dans votre cas, nous pouvons prendre un lookbehind positif: nous voulons que le contenu de la chaîne cible "prénom.nom" soit égal à "Nom d'utilisateur:".

opérateur positive lookbehind: (< = StringBehind) StringWeWant

Ceci peut être réalisé comme celui-ci, par exemple (un petit exemple Java, en utilisant la chaîne remplacer):

String test = "Account Name: firstname.surname; User Name:firstname.surname"; 
String regex = "(?<=User Name:)firstname.surname"; 
String replacement = "James.Bond"; 
System.out.println(test.replaceAll(regex, replacement)); 

Cette remplace uniquement la "firstname.surname" chaînes qui sont précédées par "User Name:" sans remplacer le "User Name:" lui-même - qui n'est pas retourné par la regex, seulement apparié.

SORTIE: Nom du compte: prénom.nom; Nom de l'utilisateur: James.Bond

C'est, si la langue que vous utilisez prend en charge ce genre d'opérations

+0

l'opérateur lookbehind positif était exactement ce dont j'avais besoin. Plus d'informations à ce sujet ici: http://www.regular-expressions.info/lookaround.html – Paul

+0

Cela devrait être la réponse. – GregoryBrad

Questions connexes