Autor
|
Tema: Regex + split con dos delimitadores en c# (Leído 4,923 veces)
|
DrKillador
Desconectado
Mensajes: 56
|
Buenas, Estoy haciendo una expresión regular en c# que me está costando sacar, para extraer de un string todos las palabras contenidas entre dos caracteres, y exportarlas a una lista. Ej. Dado el siguiente string: .hola$.que$.tal$ Querría tener la siguiente lista hola que tal Este es el código que estoy tratando de usar y que no me funciona... List <string> l = new List <string>();l = Regex.Split(str, @".{p}$").ToList();
Gracias por su ayuda!
|
|
« Última modificación: 30 Julio 2017, 15:40 pm por Eleкtro »
|
En línea
|
Python <3 Python
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
En regex, el punto y el dolar (. $) son caracteres especiales. Tienes que ponerles delante una barra invertida (\) para buscarlos en el texto.
Y bueno, no sé qué es lo que pretendes con el "{p}". Si lo que quieres es buscar lo que hay entre . y &, lo puedes hacer buscando un grupo de caracteres (+) que tenga cualquier caracter menos el punto y el dolar. Para ello: [^\.\$]. Con el ^ haces que sea algo que NO contenga esos caracteres.
En fin: \.([^\.\$]+)\$
No te olvides de que las barras invertidas son caracteres de escape también en C#, por lo que tendrás que poner 2 barras invertidas en vez de 1.
|
|
|
En línea
|
|
|
|
DrKillador
Desconectado
Mensajes: 56
|
Muchas gracias!! veo que tenía 2 errores. Sin embargo no me acaba de funcionar bien, entiendo que porque os puse un ejemplo poco claro.
Si tuviese ahora una frase como la siguiente, no me funciona la regex:
1213.hola$123.que$213.tal$234
Mi objetivo dada la frase anterior, es que igualmente obtenga la siguiente lista:
hola que tal
Separando y extrayendo a la lista solo las palabras contenidas entre el . y el $
Gracias!
|
|
|
En línea
|
Python <3 Python
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
¿Y cuál es el resultado que te da con esa frase? Ese regex hace eso, coger "hola", "que" y "tal". Si tal, pon el código que usaste.
|
|
|
En línea
|
|
|
|
DrKillador
Desconectado
Mensajes: 56
|
Sure! este es mi código: string str = "1213.hola$123.que$213.tal$234"; List <string> l = new List <string>();l = Regex.Split(str, @"\.([^\.\$]+)\$").ToList(); foreach(string s in l) { Textbox1.Text+=s+"\r\n"; }
Y esto me pinta por pantalla lo siguiente: 1213 hola 123 que 213 tal 234
Podría hacer un apaño eliminando de la lista los elementos impares... pero seguro que con una regex se puede hacer de un golpe y más eficiente
|
|
« Última modificación: 30 Julio 2017, 15:41 pm por Eleкtro »
|
En línea
|
Python <3 Python
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.866
|
Hola. 1. Estás en un foro de programación, por favor publica los bloques de código con el formato adecuado utilizando las etiquetas GeShi. 2. Las preguntas sobre C# van en el subforo de programación .NET3. Está prohibido hacer doble post, puedes usar el botón " Modificar" (para algo está). Lee las reglas del foro por favor...
El código que has mostrado hace lo que debe, partir el string en base a las capturas/coincidencias de la expresión que le has indicado. En tu expresión regular hay dos agrupaciones, la agrupación 0 (todo), y la agrupación 1 (lo que está dentro del primer grupo de paréntesis). Solamente quieres quedarte con las capturas de la agrupación 1, pues eso debes hacerlo especificando el índice del grupo "1" o en su defecto también puedes asignarle un nombre: string str = "1213.hola$123.que$213.tal$234"; Regex rgx = new Regex (@"\.(?<nombre_de_grupo>[^\.\$]+)\$", RegexOptions .None);MatchCollection matches = rgx.Matches(str); foreach (Match match in matches) { Console.WriteLine(match.Groups["nombre_de_grupo"].Value); }
Resultado de ejecución: Saludos
|
|
« Última modificación: 30 Julio 2017, 15:44 pm por Eleкtro »
|
En línea
|
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Bueno, vemaos 2 cosas. La primera, esto es un Regex.Split, con lo cual vas a tener la cadena dividida por lo encontrado. Es decir, el resultado será "123","456","789". (La razón de que se vea también el "hola","que","tal" es por los paréntesis del regex) Lo que buscas ahora es Regex.Matches, que busca todas las ocurrencias del regex (perdona que no haya visto antes el Split) Para eso, cambias el .Split() por .Matches(). No puedes hacer directamente el ToList(), eso sí. var str = "687.hola$123.que$213.tal$234"; var regex = @"\.[^\.\$]+\$"; var matches = Regex.Matches(str, regex); var n = 1; foreach (Match match in matches) { Console.WriteLine(n++ + ": " + match.Value); }
Eso sí, de este modo también te traerá el punto y el dolar. Habrá que hacer un regex algo diferente para evitar esto.
|
|
|
En línea
|
|
|
|
DrKillador
Desconectado
Mensajes: 56
|
Gracias a ambos y disculpad que haya publicado mal! He aprendido mucho de vuestras explicaciones
|
|
|
En línea
|
Python <3 Python
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[BATCH]Problema con delimitadores xD
Scripting
|
FranciskoAsdf
|
4
|
5,772
|
27 Marzo 2011, 09:08 am
por FranciskoAsdf
|
|
|
2 delimitadores para obtener texto (vb.net)
.NET (C#, VB.NET, ASP)
|
<housedir>
|
4
|
6,089
|
22 Julio 2013, 22:13 pm
por Eleкtro
|
|
|
Extraer Palabra de un String con delimitadores
PHP
|
spysecurityca
|
4
|
3,811
|
3 Septiembre 2014, 16:51 pm
por WHK
|
|
|
Delimitadores consecutivos
Scripting
|
Gokuman
|
2
|
2,732
|
14 Marzo 2015, 04:03 am
por FranciskoAsdf
|
|
|
MOVIDO: Regex + split con dos delimitadores en c#
Programación General
|
Eleкtro
|
0
|
1,966
|
30 Julio 2017, 15:38 pm
por Eleкtro
|
|