2009-03-10 12 views
19

Supongo que tengo la cadena "Nombre de usuario: nombre.nombre" contenida en una cadena más grande. ¿Cómo puedo usar una expresión regular para obtener la parte nombre.nombre?Devolviendo solo una parte de la coincidencia de la Expresión regular

Cada método que he intentado devuelve la cadena "Nombre de usuario: nombre.nombre de nombre" luego tengo que hacer una cadena reemplazar en "Nombre de usuario:" a una cadena vacía.

¿Podrían las referencias anteriores ser de utilidad aquí?

Editar:

La cadena más larga podría contener "Nombre de la cuenta: firstname.surname" por lo tanto, por qué quiero coincidir con el "Nombre de usuario:" parte de la cadena aswell para obtener sólo ese valor.

Respuesta

31

me gusta usar grupos nombrados:

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

Poner el ?<something> al principio de un grupo entre paréntesis (por ejemplo (?<something>...)) le permite obtener el valor de la coincidencia usando something como una clave (por ejemplo, de m.Groups["something"].Value)

Si no quiere ir a la dificultad de nombrar los grupos, se podría decir

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

y acaba de obtener lo primero que coincida. (Tenga en cuenta que el primer grupo entre paréntesis está en el índice 1; toda la expresión que coincide con el índice 0)

+1

Eso es grande, muchas gracias. –

2

Todas las bibliotecas de expresiones regulares que he utilizado le permiten definir grupos en la expresión regular usando paréntesis y luego acceder a ese grupo del resultado.

lo tanto, su expresión regular podría ser: Nombre de usuario: (. [. ^] [. ^])

El partido completo es el grupo 0. La parte que corresponda dentro de los paréntesis es el grupo 1.

2

hacer un grupo con parantheses, a continuación, obtener de la colección Match.Groups, así:

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: el primer grupo, con el índice 0, es todo el partido)

6

Usted COU También probaré el concepto de "lookaround". Este es un tipo de aserción de ancho cero, lo que significa que coincidirá con los caracteres, pero no los capturará en el resultado.

En su caso, podríamos echar un vistazo positivo: queremos que lo que está detrás de la cadena de destino "firstname.surname" sea igual a "User Name:".

operador de búsqueda hacia atrás Positivo: (? < = StringBehind) StringWeWant

Esto se puede lograr de esta manera, por ejemplo (un pequeño ejemplo de Java, utilizando cadena replace):

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

Esto reemplaza sólo el "firstname.surname" cadenas precedidas por "Nombre de usuario:" sin reemplazar el "Nombre de usuario:" en sí mismo - que no es devuelto por la expresión regular, solo coincide.

SALIDA: Nombre de la cuenta: firstname.surname; Nombre de Usuario: James.Bond

Es decir, si el idioma que está utilizando soportes de este tipo de operaciones

+0

el operador lookbehind positivo era exactamente lo que necesitaba. Más información sobre esto aquí: http://www.regular-expressions.info/lookaround.html – Paul

+0

Esta debería ser la respuesta. – GregoryBrad

Cuestiones relacionadas