2009-11-03 85 views

Trả lời

11

EDIT: mã VB.NET thêm dưới đây

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

Nếu bạn không thể sử dụng lambdas sau đó sử dụng một MatchEvaluator thay vào đó:

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 

Nó không thực sự là trường hợp tiêu đề theo định dạng MS Word, nhưng đủ gần.


Bạn không nói rõ ngôn ngữ, nhưng trong C# bạn có thể làm điều này:

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

này độc đáo đảm nhận một lời thư, như xâu sẽ không ném ra một lỗi trên một cái gì đó như "Một "trong đầu vào.

+0

Trong trường hợp nào là lambdas không có sẵn trong VB.NET và/hoặc C# vui lòng? –

+1

@MagnusSmith khi sử dụng các phiên bản không hỗ trợ chúng, cụ thể là C# 2.0 và VB.NET 8.0 (thường được kết hợp với Visual Studio 2005 và .NET 2.0). –

+0

Giải thích downvote? –

0

Bạn có thể làm điều đó, tuy nhiên đây là một chức năng khá phổ biến trong hầu hết các ngôn ngữ lập trình. Ví dụ, hàm là ucwords ($ word) trong PHP.

+0

Tôi chưa bao giờ sử dụng PHP, nhưng không nhớ phương thức này bằng các ngôn ngữ khác mà tôi đã sử dụng, mặc dù tôi có thể không nhận thấy nó. – Jeremy

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

Tốt và dễ - 's/\ b (\ w +)/\ u $ 1/g' hoặc' s/\ b (\ w)/\ U \ 1/g' cho ngắn. Thật không may, câu hỏi bây giờ chỉ định VB.NET, vì vậy câu trả lời Perl này không còn liên quan ... – ephemient

2

Không có trong regex "tinh khiết", nhưng hầu hết các trường nền tảng cụ thể có một cách để làm điều đó:

Ví dụ, trong python:

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

Trong trường hợp này, chúng tôi vượt qua một lambda có thể gọi đến phương thức sub() (chứ không phải là một chuỗi thay thế) sẽ trả về chuỗi kết hợp phía trên. Hầu hết các ngôn ngữ có một số ngôn ngữ tương đương, nơi bạn chuyển một cuộc gọi có thể gọi là 'thay thế'.

Trong VB.NET bạn có thể vượt qua 'thay thế' lambda của bạn như Function (x) x.Value(0).ToString().ToUpper()

5

.NET đã hỗ trợ sẵn cho việc này. Xem TextInfo.ToTitleCase để biết tài liệu.

Mã của tôi chứa một số phương pháp mở rộng cho C#. Tôi cho rằng VB.NET cũng có, nhưng tôi không biết VB.NET đủ để tự chuyển đổi chúng.

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

Tại sao không chỉ sử dụng sẵn có TextInfo.ToTitleCase() method đã có trong Khuôn khổ .NET?

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

Không biết về điều này. Có thể là một giải pháp tuyệt vời cho tôi. Cảm ơn! – Jeremy

+4

Chỉ cần lưu ý nhanh ở đây. Để đảm bảo chữ cái đầu tiên của mỗi từ được viết hoa trước tiên bạn cần phải chuyển đổi chuỗi gốc thành chữ thường. Chuỗi gốc của tôi là tất cả các mũ và '.ToTitleCase' dường như không có hiệu lực. – QFDev

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

Sử dụng ProperCase chức năng:

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

0

Làm điều này về sự kiện nhấn phím của hộp văn bản của bạn.

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


     End If 
Các vấn đề liên quan