2009-11-03 7 views

Odpowiedz

11

EDIT: kod VB.NET dodany poniżej

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)) 

Jeśli nie można używać lambdy następnie użyć MatchEvaluator zamiast:

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 

To nie jest tak naprawdę przypadek Tytułu w sensie formatowania MS Word, ale wystarczająco blisko.


Nie określić język, ale w C# można to zrobić:

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)); 

To ładnie obsługuje jedną literę słowa, jako podciąg nie wygeneruje błąd na coś takiego jak „A "na wejściu.

+0

W których scenariuszach nie są dostępne lambdy w VB.NET i/lub C#? –

+1

@MagnusSmith przy korzystaniu z wersji, które ich nie obsługiwały, a mianowicie C# 2.0 i VB.NET 8.0 (zwykle związane z Visual Studio 2005 i .NET 2.0). –

+0

Objaśnienia do objaśnień? –

0

Można to zrobić, jednak jest to dość powszechne funkcja w większości języków programowania. Na przykład funkcją jest ucwords ($ word) w PHP.

+0

Nigdy nie stosowałem PHP, ale nie pamiętam tej metody w innych językach, których używałem, chociaż mogłem tego nie zauważyć. – Jeremy

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

Ładne i łatwe - skrót "s/\ b (\ w +)/\ u 1/g" lub "s/\ b (\ w)/\ U \ 1/g". Niestety, teraz pytanie określa VB.NET, więc ta odpowiedź Perla nie ma już znaczenia ... – ephemient

2

Nie w „czystej” regex, ale większość wdrożeń platformy specyficzne mają sposób, aby to zrobić:

na przykład w Pythonie:

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

W tym przypadku Mijamy możliwość wywołania lambda do metody sub() zamiast do ciągu zastępczego, która zwróci pasujący ciąg znaków upper cased. Większość języków ma taki sam odpowiednik, kiedy przekazujesz żądanie jako "zastępstwo".

W VB.NET można zdać 'zastąpienie' lambda jako Function (x) x.Value(0).ToString().ToUpper()

5

.NET ma wbudowane wsparcie dla tego. Zobacz dokumentację w dokumencie TextInfo.ToTitleCase.

Mój kod zawiera kilka metod rozszerzenia dla języka C#. Zakładam, że VB.NET również je ma, ale nie znam VB.NETa na tyle dobrze, aby sam je przekonwertować.

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

Dlaczego nie wystarczy użyć Wbudowana już TextInfo.ToTitleCase() method w .NET Framework?

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

Nie wiedziałem o tym. To może być świetne rozwiązanie dla mnie. Dzięki! – Jeremy

+4

Krótka notka tutaj. Aby upewnić się, że pierwsza litera każdego słowa jest pisana wielką literą, najpierw musisz przekonwertować oryginalny ciąg znaków na małe litery. Mój oryginalny ciąg był cały czapki i '.ToTitleCase' nie wydaje się mieć żadnego efektu. – QFDev

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

Zastosowanie ProperCase funkcja:

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

0

Czyńcie to na klucz prasowej przypadku Twojego pola tekstowego.

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


     End If 
Powiązane problemy