2010-06-29 37 views
20

我正在尋找一個將UpperCase中的文本字符串轉換爲SentenceCase的函數。我能找到的所有例子都將文本轉換爲TitleCase。在一般意義上 將字符串轉換爲句子的.NET方法

句首字母大寫描述了資本 在一個句子中使用的方式。句子 情況下,也介紹了標準 資本,一個英語句子, 即句子 的第一個字母大寫,其餘爲 小寫(除非需要 市值特定原因, 如專有名詞,首字母縮寫,等等。)。

任何人都可以指向我的腳本或函數的方向SentenceCase?

+0

是字符串的句子,或者許多句子? – Jay 2010-06-29 14:08:52

+1

http://stackoverflow.com/questions/2135863/formatting-sentences-in-a-string-using-c – SwDevMan81 2010-06-29 14:18:57

回答

28

.NET中沒有任何內容 - 但是,這是正則表達式處理實際上可能正常工作的情況之一。首先將整個字符串轉換爲小寫字母,然後,作爲第一個近似值,您可以使用正則表達式來查找所有序列,如[a-z]\.\s+(.),並使用ToUpper()將捕獲的組轉換爲大寫。 RegEx類有一個超載的Replace()方法,它接受一個MatchEvaluator委託,它允許您定義如何替換匹配的值。

下面是這個在工作中的代碼示例:

var sourcestring = "THIS IS A GROUP. OF CAPITALIZED. LETTERS."; 
// start by converting entire string to lower case 
var lowerCase = sourcestring.ToLower(); 
// matches the first sentence of a string, as well as subsequent sentences 
var r = new Regex(@"(^[a-z])|\.\s+(.)", RegexOptions.ExplicitCapture); 
// MatchEvaluator delegate defines replacement of setence starts to uppercase 
var result = r.Replace(lowerCase, s => s.Value.ToUpper()); 

// result is: "This is a group. Of uncapitalized. Letters." 

這可以在許多不同的方式進行改進,以更好地匹配更廣泛的各種句型(不只是那些在信+週期結束) 。

+0

我做了一個擴展方法,並添加了一個可選的布爾變量,以便可選地在更改串。這將對字符串有幫助,例如下面傑伊回答中的那個。可以理解的是,這是我很少使用的東西,但我可以看到它在某些時候派上用場。 – krillgar 2014-12-31 13:28:07

4

這適用於我。

/// <summary> 
/// Converts a string to sentence case. 
/// </summary> 
/// <param name="input">The string to convert.</param> 
/// <returns>A string</returns> 
public static string SentenceCase(string input) 
{ 
    if (input.Length < 1) 
     return input; 

    string sentence = input.ToLower(); 
    return sentence[0].ToString().ToUpper() + 
     sentence.Substring(1); 
} 
+1

如果輸入是多個句子,則還需要使用點作爲分隔符來分隔每個句子。 – RvdK 2010-06-29 14:14:30

+0

或任何其他有效的標點符號 – SwDevMan81 2010-06-29 14:16:12

+2

「點作爲分隔符」並不真正切斷它。 '先生史密斯夫人每人有1000美元;他們住在木蘭大道上。在藍房子裏。' – Jay 2010-06-29 14:44:51

2

我發現這個sample on MSDN

+0

這似乎是一個非常複雜的將字符串轉換爲句子的方式。我個人認爲這是一個更適合正則表達式的問題。 – LBushkin 2010-06-29 14:27:41

2

如果你的輸入字符串不是一個句子,而是很多句子,這成爲一個非常困難的問題。

正則表達式將證明是一個非常寶貴的工具,但是(1)你必須很好地瞭解它們纔能有效,以及(2)他們可能不會完全靠自己完成工作。

考慮這句話

「誰在1日,」史密斯先生 - 誰沒有笑 - 回答。

這句話不是以一個字母開頭,它有一個數字,各種標點符號,一個正確的名字,以及一個位於中間的.

複雜性是巨大的,這是一句話。

使用RegEx時最重要的一件事是「瞭解您的數據」。如果你知道你將要處理的句子類型的廣度,你的任務將更易於管理。

在任何情況下,您都必須玩弄自己的實施,直到您對結果滿意爲止。我建議使用一些示例輸入來編寫一些自動化測試 - 當您處理實現時,您可以定期運行測試以查看您接近的位置以及您仍然缺少標記的位置。

1

這就是我使用的(VB.NET)。它工作在情況,包括:

  • 多個句子
  • 句子開頭,以空格
  • 句子比A-Z其它字符開始結束。例如,它將適用於:「如果你想要100.00美元,那就問我」。

    <Extension()> 
    Public Function ToSentanceCase(ByVal s As String) As String 
        ' Written by Jason. Inspired from: http://www.access-programmers.co.uk/forums/showthread.php?t=147680 
    
        Dim SplitSentence() As String = s.Split(".") 
    
        For i = 0 To SplitSentence.Count - 1 
         Dim st = SplitSentence(i) 
    
         If st.Trim = "" Or st.Trim.Count = 1 Then Continue For ' ignore empty sentences or sentences with only 1 character. 
    
         ' skip past characters that are not A-Z, 0-9 (ASCII) at start of sentence. 
         Dim y As Integer = 1 
         Do Until y > st.Count 
          If (Asc(Mid(st, y, 1)) >= 65 And Asc(Mid(st, y, 1)) <= 90) Or _ 
            (Asc(Mid(st, y, 1)) >= 97 And Asc(Mid(st, y, 1)) <= 122) Or _ 
           (Asc(Mid(st, y, 1)) >= 48 And Asc(Mid(st, y, 1)) <= 57) Then 
           GoTo Process 
          Else 
           Dim w = Asc(Mid(st, y, 1)) 
           y += 1 
          End If 
         Loop 
         Continue For 
    
    Process: 
         Dim sStart As String = "" 
         If y > 1 Then sStart = Left(st, 0 + (y - 1)) 
    
         Dim sMid As String = UCase(st(y - 1)) ' capitalise the first non-space character in sentence. 
    
         Dim sEnd As String = Mid(st, y + 1, st.Length) 
    
         SplitSentence(i) = sStart & sMid & sEnd 
    
        Next 
    
        ' rejoin sentances back together: 
        Dim concat As String = "" 
        For Each st As String In SplitSentence 
         concat &= st & "." 
        Next 
    
        concat = concat.TrimEnd(1) 
    
        Return concat 
    
    End Function 
    

但是作爲專有名詞和縮略語,嗯...有總是要在英語語言的情況下標點符號不是那麼簡單。例如,這個腳本不會檢測省略號(「...」)或縮寫(例如:「瓊斯先生居住在克里斯家附近的木蘭大道上)」。

要完全解決這個問題,您需要爲該語言生成一個所有可能的縮寫/標點符號的字典,並且保持該字典最新!考慮到這一點,大多數人都會對妥協感到高興,否則只能使用Microsoft Word。

2

如果您想判情況下,包含的不僅僅是時期其他標點符號的字符串:

string input = "THIS IS YELLING! WHY ARE WE YELLING? BECAUSE WE CAN. THAT IS ALL."; 
var sentenceRegex = new Regex(@"(^[a-z])|[?!.:,;]\s+(.)", RegexOptions.ExplicitCapture); 
input = sentenceRegex.Replace(input.ToLower(), s => s.Value.ToUpper()); 
-1
public string GetSentenceCase(string ReqdString) { 
    string StrInSentCase = ""; 
    for (int j = 0; j < ReqdString.Length; j++) { 
     if (j == 0) { 
      StrInSentCase = ReqdString.ToString().Substring(j, 1).ToUpper(); 
     } 
     else { 
      StrInSentCase = StrInSentCase + ReqdString.ToString().Substring(j, 1).ToLower(); 
     } 
    } 
    return StrInSentCase.ToString(); 
} 
相關問題