2009-03-10 9 views
19

Dire che la stringa "Nome utente: nome.cognome" è contenuta in una stringa più grande, come posso utilizzare un'espressione regolare per ottenere solo la parte firstname.surname?Restituisce solo una parte della corrispondenza dall'espressione regolare

Ogni metodo che ho provato restituisce la stringa "Nome utente: firstname.surname", quindi devo sostituire una stringa su "Nome utente:" su una stringa vuota.

I riferimenti potrebbero essere utili qui?

Edit:

La stringa poteva più contenere "Nome account: firstname.surname" da qui perché voglio che corrisponda al "Nome utente:" parte della stringa aswell per ottenere solo quel valore.

risposta

31

mi piace usare i gruppi denominati:

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

mettere il ?<something> all'inizio di un gruppo tra parentesi (ad esempio (?<something>...)) consente di ottenere il valore dal match con something come chiave (ad esempio da m.Groups["something"].Value)

Se non si vuole andare alla difficoltà di nominare i gruppi, si potrebbe dire

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

e ottieni solo la prima cosa che corrisponde. (Si noti che il primo gruppo tra parentesi è indice di 1, l'intera espressione che corrisponde è indice 0)

+1

che è grande, grazie mille. –

2

Tutte le librerie di espressioni regolari che ho usato consentono di definire gruppi nella espressione regolare utilizzando parentesi, e quindi accedere a tale gruppo dal risultato

Così, il vostro espressione regolare potrebbe essere simile: Nome utente: (. [. ^] [. ^])

La partita è completa di gruppo 0. La parte che corrisponde all'interno delle parentesi è gruppo 1.

2

creare un gruppo con parantheses, quindi ottenere dalla collezione Match.Groups, in questo modo:

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

(nota: il primo gruppo, con indice 0, è tutta la partita)

6

è cou provare anche il concetto di "lookaround". Questo è un tipo di asserzione a larghezza zero, il che significa che abbinerà i caratteri ma non li catturerà nel risultato.

Nel tuo caso, potremmo dare un'occhiata positiva: vogliamo che cosa c'è dietro la stringa di destinazione "firstname.surname" uguale a "User Name:".

operatore lookbehind positivo: (? < = StringBehind) StringWeWant

Ciò può essere ottenuto in questo modo, per esempio (un piccolo esempio Java, usando stringhe sostituire):

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)); 

Questo sostituisce solo la stringhe "nome.cognome" precedute da "Nome utente:" senza sostituire "Nome utente:" stesso - che non viene restituito dalla regex, solo abbinato.

OUTPUT: Nome account: firstname.surname; Nome Utente: James.Bond

Cioè, se la lingua si sta utilizzando supporti questo tipo di operazioni

+0

l'operatore di ricerca positivo era esattamente ciò di cui avevo bisogno. Maggiori informazioni su questo qui: http://www.regular-expressions.info/lookaround.html – Paul

+0

Questa dovrebbe essere la risposta. – GregoryBrad

Problemi correlati