2010-03-08 14 views
13

¿Cómo se reemplazan todas las letras UpperCase con subrayado y la letra en C#? nota: a menos que el carácter ya esté precedido por un guión bajo.C# - Reemplazar cada letra UpperCase con subrayado y la letra

ACTUALIZACIÓN: Por ejemplo, Mike Jones
se convertiría en
Mike_Jones

Pero Mike_Jones
no se convertiría en
Mike__Jones

Es Regex el mejor enfoque? ¿Por dónde empiezo con este?

+0

Se puede editar su pregunta y proporcionar un ejemplo de lo que quiere decir? es decir, la cadena se ve así pero después de hacer lo que quiero se vería así? – ahsteele

Respuesta

25

Regex suena mejor:

string input = "Test_StringForYou"; 
string replaced = Regex.Replace(input, @"(?<!_)([A-Z])", "_$1"); 
Console.WriteLine(replaced); 

Salida: _Test_String_For_You

Asegúrese de añadir una using System.Text.RegularExpressions;

+0

+1 para manejar correctamente el guión bajo anterior. –

+0

¡No había notado esa advertencia! –

+0

+1 - ¿hay alguna manera de alterar el Regex para que la primera letra no tenga guiones bajos al frente? – BuddyJoe

1
Regex.Replace(subject, "([A-Z])", "_$1"); 

cambia el Fox rápido de Brown a _El _Quick _Brown _Fox

Es que es lo que necesitas?

0

Si usted está mirando para transformar este:

Texto de ejemplo

En

_sample _TEXT

Pues no, no es estrictamente expresión regular haz eso, ya que no puedes transformar capturas o grupos en el representante expresión de laceración. Por supuesto, podría usar la respuesta de Jake y agregar una llamada al .ToLower(), que reemplazaría todas las letras mayúsculas con letras minúsculas.

Si todo lo que pretendes hacer es anteponer un guión bajo a cada letra mayúscula que aún no tenga una, la respuesta de Jake por sí sola debería ser la solución.

+2

Incorrecto. Puede (http://msdn.microsoft.com/en-us/library/cft8645c%28VS.80%29.aspx). – kennytm

+1

@Kenny: No está mal, ya que la sintaxis RegEx no permite las transformaciones. La * API * lo hace, en este caso, pero no la sintaxis misma. Para este ejemplo, creo que al llamar 'ToLower()' es probable que se obtenga un código más claro y simple. –

+0

Entonces, la sintaxis de RegEx tampoco permite el reemplazo. Pero estoy de acuerdo en escanear la cadena y usar '.ToLower()' es mucho mejor que RegEx en este caso. – kennytm

2

Así que usted no quiere cambiar la caja de las letras! Sé que no dijiste que lo hiciste, pero algunos de nosotros lo asumimos porque esa pregunta surge muy a menudo. En ese caso, esta expresión regular es todo lo que necesita:

s = Regex.Replace(s, @"(?<=[a-z])([A-Z])", @"_$1"); 

Hacer la búsqueda hacia atrás positivo por una letra minúscula también asegura que no agrega un guión al principio de la cadena.

0
using System.Text.RegularExpressions; 

//----------------------------------------------------------------- 

string str = Regex.Replace("MyString", @"([A-Z])", " $1").Trim(); 

//----------------------------------------------------------------- 

str givs "My String" 

Está funcionando agradable

0

No sé si esto sigue siendo relevante, pero aquí es una forma sencilla de hacerlo.

private string StripInput(string input) 
    { 
     var output = input 
      .Replace(" ", "_") 
      .ToLower().Trim(); 
     return output; 
    } 

string TEST = "Hello World"; 
    litTest.Text = StripInput(TEST); 

saldrá como: hola_mundo

+2

Esto no reemplaza todas las letras mayúsculas con un guión bajo ** y ** la letra. Reemplaza los espacios con un guión bajo y lo hace todo en minúscula. –

Cuestiones relacionadas