Regex + split con dos delimitadores en c#

Iniciado por DrKillador, 30 Julio 2017, 10:27 AM

0 Miembros y 1 Visitante están viendo este tema.

DrKillador

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...

Código (csharp) [Seleccionar]
List<string> l = new List<string>();
l = Regex.Split(str, @".{p}$").ToList();

Gracias por su ayuda!
Python <3 Python

ivancea96

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.

DrKillador

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!
Python <3 Python

ivancea96

¿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.

DrKillador

#4
Sure! este es mi código:

Código (csharp) [Seleccionar]
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
Python <3 Python

Eleкtro

#5
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 .NET

3. 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:

Código (csharp) [Seleccionar]
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:
hola
que
tal


Saludos








ivancea96

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í.

Código (csharp) [Seleccionar]
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.

DrKillador

Gracias a ambos y disculpad que haya publicado mal!

He aprendido mucho de vuestras explicaciones  ;-)
Python <3 Python