.NET方法将字符串转换为句子大小写

时间:2010-06-29 14:04:45

标签: c# string sentencecase

我正在寻找一个函数来将UpperCase中的一串文本转换为SentenceCase。我能找到的所有例子都将文本转换为TitleCase。

  

一般意义上的判刑案件   描述了大写的方式   在一个句子中使用。句子   案例也描述了标准   英语句子的大写,   即句子的第一个字母   资本化,剩下的就是   小写(除非要求   出于特定原因的资本化,   例如专有名词,首字母缩略词等。)。

有人能指出我对SentenceCase的脚本或函数的方向吗?

9 个答案:

答案 0 :(得分:32)

.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."

这可以通过多种不同的方式进行改进,以更好地匹配更广泛的句型(不仅仅是以字母+句号结尾的那些)。

答案 1 :(得分:7)

这适合我。

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

答案 2 :(得分:4)

内置ToTitleCase()功能将在未来扩展以支持多种文化。

来自MSDN的示例:

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      string[] values = { "a tale of two cities", "gROWL to the rescue",
                          "inside the US government", "sports and MLB baseball",
                          "The Return of Sherlock Holmes", "UNICEF and children"};

      TextInfo ti = CultureInfo.CurrentCulture.TextInfo;
      foreach (var value in values)
         Console.WriteLine("{0} --> {1}", value, ti.ToTitleCase(value));
   }
}
// The example displays the following output:
//    a tale of two cities --> A Tale Of Two Cities
//    gROWL to the rescue --> Growl To The Rescue
//    inside the US government --> Inside The US Government
//    sports and MLB baseball --> Sports And MLB Baseball
//    The Return of Sherlock Holmes --> The Return Of Sherlock Holmes
//    UNICEF and children --> UNICEF And Children

虽然它通常很有用但它有一些重要的限制:

  

通常,标题大小写会将单词的第一个字符转换为   大写,其余字符为小写。但是,这个   方法目前没有提供适当的套管来转换一个单词   完全是大写的,例如首字母缩略词。下表显示   方法呈现多个字符串的方式。

     

... ToTitleCase方法提供任意的套管行为   这不一定在语言上是正确的。语言学上的   正确的解决方案需要额外的规则和当前的   算法更简单,更快捷。我们保留制作权   这个API将来会慢一些。

来源:http://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase.aspx

答案 3 :(得分:2)

我发现了sample on MSDN

答案 4 :(得分:2)

如果你的输入字符串不是一个句子,而是很多句子,这就成了一个非常困难的问题。

正则表达式将被证明是一个非常宝贵的工具,但是(1)你必须非常了解它们才能有效,并且(2)它们可能不完全靠自己完成工作。

考虑这句话

  

“谁是第一名,”史密斯先生 - 不笑 - 回答道。

这句话不是以字母开头,有一个数字,各种标点符号,一个专有名称,中间是.

复杂性是巨大的,这是一句话。

使用RegEx时最重要的事情之一就是“了解您的数据”。如果你知道你将要处理的句子类型的广度,你的任务将更易于管理。

无论如何,在您对结果感到满意之前,您必须自己动手实施。我建议使用一些示例输入来编写一些自动化测试 - 当您处理实现时,您可以定期运行测试以查看您接近的位置以及您仍然缺少标记的位置。

答案 5 :(得分: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());

答案 6 :(得分:1)

这就是我使用的(VB.NET)。它适用于大多数情况,包括:

  • 多句话
  • 以空格开头和结尾的句子
  • 以A-Z以外的字符开头的句子。例如,它适用于:“如果你想要100美元,那么就问我”。

    <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
    

但至于专有名词和首字母缩略词,那么......在英语中总会出现标点符号不那么简单的情况。例如,此脚本不会检测省略号(“...”)或缩写(例如:“琼斯先生住在克里斯家附近的Magnolia Blvd.”。

要完全解决这个问题,您需要为该语言生成所有可能缩写/标点符号的字典,并使字典保持最新状态!考虑到这一点后,大多数人会对妥协感到满意,否则只需使用Microsoft Word。

答案 7 :(得分:1)

F#中的解决方案:

void func() {
    attribute = 3;  
}

答案 8 :(得分:-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();
}