2010-03-08 6 views
13

Comment remplacer chaque lettre UpperCase avec Underscore et la lettre en C#? note: à moins que le caractère ne soit déjà précédé d'un trait de soulignement.C# - Remplacer chaque lettre UpperCase avec Underscore et la lettre

MISE À JOUR: Par exemple,
Mike Jones serait transformé en
Mike_Jones

Mais Mike_Jones
ne serait pas transformé en
Mike__Jones

est Regex la meilleure approche? Où dois-je commencer avec celui-ci?

+0

Pouvez-vous modifier votre question et donner un exemple de ce que vous voulez dire? c'est-à-dire que la chaîne ressemble à ceci mais après avoir fait ce que je veux ressembler à ceci? – ahsteele

Répondre

25

Regex sonne mieux:

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

Sortie: _Test_String_For_You

Assurez-vous d'ajouter un using System.Text.RegularExpressions;

+0

+1 pour gérer correctement le trait de soulignement précédent. –

+0

N'avait pas remarqué cette mise en garde! –

+0

+1 - Y at-il un moyen de modifier le Regex afin que la première lettre n'ait pas de trait de soulignement devant? – BuddyJoe

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

change Le Quick Brown Fox _La _Rapide _Brown _Fox

Est ce que tu as besoin?

0

Si vous cherchez à transformer ceci:

Exemple de texte

Dans

_sample _TEXT

Alors non, ne sera pas strictement RegEx faites cela, car vous ne pouvez pas transformer des captures ou des groupes dans le rep expression de lacement. Vous pouvez, bien sûr, utiliser la réponse de Jake et ajouter un appel .ToLower() à la fin, qui remplacerait toutes les majuscules par des lettres minuscules.

Si tout ce que vous cherchez à faire est d'ajouter un trait de soulignement à chaque majuscule qui n'en a pas déjà, alors la réponse de Jake devrait faire l'affaire.

+2

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

+1

@Kenny: Ce n'est pas faux, car la syntaxe RegEx ne permet pas les transformations. L'API * fait, dans ce cas, mais pas la syntaxe elle-même. Pour cet exemple, je pense qu'appeler 'ToLower()' est susceptible d'aboutir à un code plus clair et plus simple. –

+0

Ensuite, la syntaxe RegEx ne permet pas le remplacement non plus. Mais je suis d'accord pour scanner la chaîne et utiliser '.ToLower()' est beaucoup mieux que RegEx dans ce cas. – kennytm

2

Donc vous ne voulez pas voulez changer la casse des lettres! Je sais que vous ne l'avez pas dit, mais certains d'entre nous l'ont supposé parce que cette question revient si souvent. Dans ce cas, ce regex est tout ce dont vous avez besoin:

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

Faire la lookbehind positive pour une lettre minuscule assure également que vous n'ajoutez pas un trait de soulignement au début de la chaîne.

0
using System.Text.RegularExpressions; 

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

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

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

str givs "My String" 

Il fonctionne bien

0

Ne pas savoir si cela est encore relevent, mais voici un moyen simple de le faire.

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

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

VIENDRA comme: hello_world

+2

Cela ne remplace pas chaque lettre majuscule avec un trait de soulignement ** et ** la lettre. Il remplace les espaces par un trait de soulignement et fait tout en minuscules. –

Questions connexes