2009-11-03 8 views

Répondre

11

EDIT: code VB.NET ajouté ci-dessous

Dim input As String = "The quick brown fox jumps over the lazy dog" 
Dim pattern As String = "\b(\w|['-])+\b" 
' With lambda support: 
Dim result As String = Regex.Replace(input, pattern, _ 
    Function (m) m.Value(0).ToString().ToUpper() & m.Value.Substring(1)) 

Si vous ne pouvez pas utiliser lambdas puis utilisez un MatchEvaluator à la place:

Dim evaluator As MatchEvaluator = AddressOf TitleCase 
Dim result As String = Regex.Replace(input, pattern, evaluator) 

Public Function TitleCase(ByVal m As Match) As String 
    Return m.Value(0).ToString().ToUpper() & m.Value.Substring(1) 
End Function 

Ce n'est pas vraiment un cas de titre dans le sens du formatage MS Word, mais assez proche.


Vous n'avez pas spécifié la langue, mais en C#, vous pouvez le faire:

string input = "The quick brown fox jumps over the lazy dog"; 
string pattern = @"\b(\w|['-])+\b"; 
string result = Regex.Replace(input, pattern, 
        m => m.Value[0].ToString().ToUpper() + m.Value.Substring(1)); 

Cela gère bien un des mots de lettre, comme Substring ne lancera pas d'erreur sur quelque chose comme « A "dans l'entrée.

+0

Dans quels scénarios lambdas ne sont pas disponibles dans VB.NET et/ou C# s'il vous plaît? –

+1

@MagnusSmith lors de l'utilisation des versions qui ne les prenaient pas en charge, à savoir C# 2.0 et VB.NET 8.0 (généralement associés à Visual Studio 2005 et .NET 2.0). –

+0

Explication Downvote? –

0

Vous pouvez le faire, mais cela est une fonction assez courante dans la plupart des langages de programmation. Par exemple, la fonction est ucwords ($ word) en PHP.

+0

Je n'ai jamais utilisé PHP, mais je ne me souviens pas de cette méthode dans d'autres langues que j'ai utilisées, même si je ne l'ai pas remarqué. – Jeremy

4
s/\b(\w+)\b/ucfirst($1)/ge 
+1

Nice et facile - 's/\ b (\ w +)/\ u $ 1/g' ou' s/\ b (\ w)/\ U \ 1/g' pour faire court. Malheureusement, la question maintenant spécifie VB.NET, donc cette réponse Perl n'est plus pertinente ... – ephemient

2

Non regex "pure", mais la plupart des implémentations spécifiques à la plateforme ont une façon de le faire:

Par exemple, en python:

import re 
re.compile(r'\b\w').sub(lambda x: x.group(0).upper(), 'hello') 

Dans ce cas, nous passons une appelable lambda à la méthode sub() (plutôt qu'à une chaîne de remplacement) qui retournera la chaîne correspondante en haut. La plupart des langues ont un équivalent où vous passez un appelable comme le «remplacement».

En VB.NET, vous pouvez passer votre 'remplacement' lambda comme Function (x) x.Value(0).ToString().ToUpper()

5

.NET a intégré le support pour cela. Voir TextInfo.ToTitleCase pour la documentation.

Mon code contient des méthodes d'extension pour C#. Je suppose que VB.NET les a aussi, mais je ne connais pas assez bien VB.NET pour les convertir moi-même.

public static class StringExtensions { 
    public static string ToTitleCase(this string value) { 
     return value.ToTitleCase(CultureInfo.InvariantCulture); 
    } 

    public static string ToTitleCase(this string value, CultureInfo culture) { 
     return value.ToTitleCase(culture.TextInfo); 
    } 

    public static string ToTitleCase(this string value, TextInfo textInfo) { 
     return textInfo.ToTitleCase(value); 
    } 
} 
25

Pourquoi ne pas simplement utiliser le TextInfo.ToTitleCase() method déjà intégré dans le .NET Framework?

string capitalized = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase("this string should be capitalized!"); 
+0

Ne savait pas à ce sujet. Pourrait être une excellente solution pour moi. Merci! – Jeremy

+4

Juste une note rapide ici. Pour vous assurer que la première lettre de chaque mot est en majuscule, vous devez d'abord convertir la chaîne d'origine en minuscules. Ma chaîne d'origine était en majuscules et '.ToTitleCase' ne semblait pas avoir d'effet. – QFDev

5
Dim s As String = "your string" 
Dim s2 As String = StrConv(s, VbStrConv.ProperCase 
MessageBox.Show(s2) 
2

Utilisez la fonction ProperCase:

Dim Str As String = "the quick brown fox jumps over the lazy dog" 
Dim NewStr As String = StrConv(Str, VbStrConv.ProperCase) 

0

faire sur l'événement de presse clé de votre zone de texte.

If e.KeyChar <> ChrW(Keys.Back) Then 
      If txtEname.Text = "" Then 
       e.KeyChar = UCase(e.KeyChar) 
      End If 


     End If 
Questions connexes