2008-10-28 22 views
5

Necesito hacer corresponder una cadena como "uno, dos, tres, cuatro, cinco, seis, siete, ocho, nueve, diez, once" en grupos de cuatro oraciones. Necesito una expresión regular para dividir la cadena en un grupo después de cada cuarto período. Algo así como:Dividir cadena en oraciones usando la expresión regular

string regex = @"(.*.\s){4}"; 

    System.Text.RegularExpressions.Regex exp = new System.Text.RegularExpressions.Regex(regex); 

    string result = exp.Replace(toTest, ".\n"); 

no funciona porque va a reemplazar el texto antes de los períodos, no sólo los mismos períodos. ¿Cómo puedo contar solo los períodos y reemplazarlos por un punto y un nuevo carácter de línea?

Respuesta

1

Tratar de definir el método

private string AppendNewLineToMatch(Match match) { 
    return match.Value + Environment.NewLine; 
} 

y el uso de

string result = exp.Replace(toTest, AppendNewLineToMatch); 

Esto se debe llamar al método para cada partido, y reemplazarlo con el resultado de ese método. El resultado del método sería el texto coincidente y una nueva línea.


EDIT: También, estoy de acuerdo con Oliver. La definición de expresiones regulares correcta debe ser:

string regex = @"([^.]*[.]\s*){4}"; 

Otra edición: Se ha corregido la expresión regular, es de esperar que lo hizo bien esta vez.

+0

El @ "[^.] * [.] \ T * {4}" expresión da un error cuantificador anidada. La expresión @ "([^.] * [.]) {4} \ s *"; (de James Curran) resultados en: uno. dos. Tres. las cuatro. uno. dos. Tres. las cuatro. nueve. diez. once –

2

. en un medio de expresiones regulares "cualquier carácter"

por lo que en su expresión regular, que ha usado .*. que coincidirá con una palabra (esto es equivalente a .+)

Probablemente estabas buscando [^.]\*[.] - una serie de caracteres que no son "." seguidos por ".".

0

Expresión de búsqueda: @"(?:([^\.]+?).\s)(?:([^\.]+?).\s)(?:([^\.]+?).\s)(?:([^\.]+?).\s)" reemplaza expresiones: "$1 $2 $3 $4.\n"

he corrió esta expresión en RegexBuddy con expresiones regulares de .NET seleccionado, y la salida es:

one two three four. 
five six seven eight. 
nine. ten. eleven 

me trataron con un tipo de @"(?:([^.]+?).\s){4}" arreglo, pero la captura solo capturará la última ocurrencia (es decir, palabra), así que cuando se trata de reemplazar, perderá tres palabras de 4. Por favor, alguien me corrija si estoy equivocado.

+0

La secuencia original resultó en (corchetes para mostrar una línea [uno dos tres.] [cuatro cinco seis siete.] [ocho, nueve, diez, once]. Ejecutar esto en una cadena como: "uno, dos, tres". cuatro, cinco, seis, siete, ocho, nueve, diez, once "resultó en [uno dos thre.] [. four fiv six.] –

0

¿Está obligado a hacer esto a través de regex? ¿No sería más fácil simplemente dividir la cadena y luego procesar la matriz?

-1

En este caso, parece que la expresión regular es un poco exagerada. Yo recomendaría usar String.split y luego dividir la matriz de cadenas resultante. Debería ser mucho más simple y mucho más confiable que tratar de hacer que una expresión regular haga lo que intentas hacer.

Algo como esto podría ser un poco más fácil de leer y depurar.

String s = "one. two. three. four. five. six. seven. eight. nine. ten. eleven" 
String[] splitString = s.split(".") 
List li = new ArrayList(splitString.length/2) 
for(int i=0;i<splitString.length;i+=4) { 
    st = splitString[i]+"." 
    st += splitString[i+1]+"." 
    st += splitString[i+2]+"." 
    st += splitString[i+3]+"." 
    li.add(st) 
} 
0

No estoy seguro de si la respuesta del configurador se dañó por el editor o qué, pero no funciona. el patrón correcto es

string regex = @"([^.]*[.]){4}\s*"; 
Cuestiones relacionadas