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

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

一般意义上的句子描述了在句子中使用大写的方式。 句子案例还描述了英语句子的标准大写,即句子的第一个字母大写,其余为小写(除非因特定原因需要大写,例如专有名词,首字母缩略词等)。

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

.NET中没有内置任何东西 – 但是,这是正则表达式处理实际上可以正常工作的情况之一。 我首先将整个字符串转换为小写,然后,作为第一个近似,您可以使用正则表达式来查找所有序列,如[az]\.\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(@"(^[az])|\.\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." 

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

这对我有用。

 ///  /// Converts a string to sentence case. ///  /// The string to convert. /// A string public static string SentenceCase(string input) { if (input.Length < 1) return input; string sentence = input.ToLower(); return sentence[0].ToString().ToUpper() + sentence.Substring(1); } 

内置的ToTitleCasefunction将在未来扩展以支持多种文化。

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

我在MSDN上找到了这个样本 。

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

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

考虑一下这句话

“谁是第一名,”史密斯先生 – 他没有笑 – 回答道。

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

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

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

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

如果你想判断一个包含标点符号而不仅仅是句点的字符串:

 string input = "THIS IS YELLING! WHY ARE WE YELLING? BECAUSE WE CAN. THAT IS ALL."; var sentenceRegex = new Regex(@"(^[az])|[?!.:,;]\s+(.)", RegexOptions.ExplicitCapture); input = sentenceRegex.Replace(input.ToLower(), s => s.Value.ToUpper()); 

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

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

      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 AZ, 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。

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