2012-02-08 23 views
6

Estoy desarrollando una aplicación usando C# .net en la que necesito que si una entrada ingresada por el usuario contiene el caracter '-' (guión), entonces quiero que los vecinos inmediatos de la el guión (-) para ser concatenadas, por ejemplo, si un usuario entraConcatenar caracteres adyacentes de un carácter especial "-"

A-B-C then i want it to be replaced with ABC 
AB-CD then i want it to be replaced like BC 
ABC-D-E then i want it to be replaced like CDE 
AB-CD-K then i want it to be replaced like BC and DK both separated by keyword and 

después de conseguir esto tengo que preparar mi consulta a la base de datos.

espero haber aclarado el problema, pero si necesita más aclaración, hágamelo saber. Cualquier ayuda será apreciada mucho.

Gracias, Devjosh

+0

expresiones regulares son la respuesta aquí ([AZ]) - ([AZ]) – Tom

+0

cómo debería utilizarlo en las funciones de manipulación de cadena C# ¿elaboraría más @Tom – Devjosh

+0

Entonces, ¿qué quiere 'ABC-DE' ¿para producir? 'CD' y' DE'? Es confuso – Aliostad

Respuesta

3

no probado, pero esto debe hacer el truco, o por lo menos le dirigirán en la dirección correcta.

private string Prepare(string input) 
{ 
    StringBuilder output = new StringBuilder(); 
    char[] chars = input.ToCharArray(); 
    for (int i = 0; i < chars.Length; i++) 
    { 
     if (chars[i] == '-') 
     { 
      if (i > 0) 
      { 
       output.Append(chars[i - 1]); 
      } 
      if (++i < chars.Length) 
      { 
       output.Append(chars[i]) 
      } 
      else 
      { 
       break; 
      } 
     } 
    } 
    return output.ToString(); 
} 

Si desea cada pareja para formar un objeto separado en una matriz, tratar el siguiente código:

private string[] Prepare(string input) 
{ 
    List<string> output = new List<string>(); 
    char[] chars = input.ToCharArray(); 
    for (int i = 0; i < chars.Length; i++) 
    { 
     if (chars[i] == '-') 
     { 
      string o = string.Empty; 
      if (i > 0) 
      { 
       o += chars[i - 1]; 
      } 
      if (++i < chars.Length) 
      { 
       o += chars[i] 
      } 
      output.Add(o); 
     } 
    } 
    return output.ToArray(); 
} 
+0

Por favor déjame probar y déjame saber ... – Devjosh

+0

Funciona un poco cerca de @zenxer pero se está fallando en un caso "AB-CD-K luego quiero que se lo reemplace como BC y DK como instancias de cadena diferentes" esta particularmente – Devjosh

+0

¿Qué quiere decir con instancias de cadena separadas? – Zenexer

1

me corrija si estoy equivocado, pero sin duda todo lo que tiene que hacer es quitar el '-'?

así:

"A-B-C".Replace("-",""); 
+0

Gracias @steve pero mis cadenas son ingresadas por el usuario y esto no es necesario para que cada bloque contenga un solo carácter, puede contener 2 o 3 o puede tener n caracteres AB-CD o ABC-DE etc. – Devjosh

4

Uso:

string[] input = { 
         "A-B-C", 
         "AB-CD", 
         "ABC-D-E", 
         "AB-CD-K" 
        }; 

var regex = new Regex(@"\w(?=-)|(?<=-)\w", RegexOptions.Compiled); 

var result = input.Select(s => string.Concat(regex.Matches(s) 
    .Cast<Match>().Select(m => m.Value))); 

foreach (var s in result) 
{ 
    Console.WriteLine(s); 
} 

Salida:

ABC 
BC 
CDE 
BCDK 
+0

Las expresiones regulares son excesivas para esto. – Zenexer

+0

@Kirill Polishchuk gracias pero está restringiendo el problema solo a un cierto conjunto de cadenas Quiero una solución genérica No puedo suponer qué combinación de caracteres y - el usuario puede ingresar en este campo – Devjosh

+0

@Devjosh, ¿Qué quieres decir? Proporcioné regex que se puede aplicar a diferentes conjuntos de cuerdas. –

1

Incluso puede resolver esto con una sola línea (aunque un poco feo):

String.Join(String.Empty, input.Split('-').Select(q => (q.Length == 0 ? String.Empty : (q.Length > 1 ? (q.First() + q.Last()).ToString() : q.First().ToString())))).Substring(((input[0] + input[1]).ToString().Contains('-') ? 0 : 1), input.Length - ((input[0] + input[1]).ToString().Contains('-') ? 0 : 1) - ((input[input.Length - 1] + input[input.Length - 2]).ToString().Contains('-') ? 0 : 1)); 

primero se divide la cadena en una matriz en cada '-', entonces se concatena sólo el primero y el último carácter de cada cadena (o simplemente el único personaje si sólo hay una, y se deja la cadena vacía si no hay nada allí), y luego concatena el enumerable resultante a una Cadena. Finalmente tiramos la primera y la última letra, si no están en el rango necesario.

que sé, es feo, sólo digo que es posible ..

Probablemente es mucho mejor utilizar sólo un simple

new Regex(@"\w(?=-)|(?<=-)\w", RegexOptions.Compiled) 

y luego trabajar con eso ..

EDITAR @Kirill Polishchuk fue más rápido .. su solución debe trabajar ..

EDIT 2

después de la pregunta ha sido actualizado, He aquí un fragmento que debe hacer el truco:

 string input = "A-B-C"; 
     string s2; 
     string s3 = ""; 
     string s4 = ""; 
     var splitted = input.Split('-'); 
     foreach(string s in splitted) { 
      if (s.Length == 0) 
       s2 = String.Empty; 
      else 
       if (s.Length > 1) 
        s2 = (s.First() + s.Last()).ToString(); 
       else 
        s2 = s.First().ToString(); 
      s3 += s4 + s2; 
      s4 = " and "; 
     } 
     int beginning; 
     int end; 
     if (input.Length > 1) 
     { 
      if ((input[0] + input[1]).ToString().Contains('-')) 
       beginning = 0; 
      else 
       beginning = 1; 
      if ((input[input.Length - 1] + input[input.Length - 2]).ToString().Contains('-')) 
       end = 0; 
      else 
       end = 1; 
     } 
     else 
     { 
      if ((input[0]).ToString().Contains('-')) 
       beginning = 0; 
      else 
       beginning = 1; 
      if ((input[input.Length - 1]).ToString().Contains('-')) 
       end = 0; 
      else 
       end = 1; 
     } 
     string result = s3.Substring(beginning, s3.Length - beginning - end); 

No es muy elegante, pero debería funcionar (no probado, aunque ..). funciona casi igual que el one-liner de arriba ...

+0

Si bien estos métodos parecen elegantes, no son los más eficientes. Probablemente tomaría la ruta más eficiente, pero dependería de la aplicación. Si ya estoy usando muchas expresiones regulares, ¿por qué no agregar una más? – Zenexer

+0

He actualizado la respuesta .. – ramsesoriginal

Cuestiones relacionadas