【问题标题】:ToTitleCase() method is not working with Special CharactersToTitleCase() 方法不适用于特殊字符
【发布时间】:2020-04-02 11:57:42
【问题描述】:

我有一个需要转换的字符串,以便将第一个字符转换为大写。使用 ToTitleCase 方法它可以正常工作,除了有特殊字符的情况。

下面是代码和预期结果

String textToConvert= "TEST^S CHECK"
TextInfo myTI = new CultureInfo("en-US",false).TextInfo;
       return myTI.ToTitleCase(textToConvert.ToLower())

预期结果:Test^s 检查 但结果是 Test^S Check with "S" 在特殊字符后转换为大写 ^

有没有办法将转换更改为预期结果

【问题讨论】:

  • 不适用于ToTitleCase,尽管他们确实保留了将来使功能变慢的权利;)-为此,现在,您必须自己动手(这应该不难做)。
  • 你希望这个字符串变成什么? "TEST.S CHECK"?
  • @LasseV.Karlsen:应该是Test.s Check
  • 符号 ^ 被称为“Circumflex 重音”,在 Unicode 中被声明为“修饰符符号”。在 C# 中有一个 small static function 确定字符是否为单词分隔符,修饰符符号是否为单词分隔符。这意味着就 .NET 而言,以下字符 S 是一个单独的词。
  • 请注意,ToTitleCase 实际上工作得很好,只是你想要的不是它支持的。也就是说,这个处理不是bug,应该是这样的。

标签: c# cultureinfo case-conversion


【解决方案1】:

ToTitleCase 是一种方便的方法,但如果您需要更细粒度的控制,Regex 可能是更好的选择:

string titleCase = Regex.Replace(textToConvert.ToLower(), @"^[a-z]|(?<= )[a-z]",
    match => match.Value.ToUpper());

^[a-z]|(?&lt;=\s)[a-z] 将匹配字符串开头的字母,以及前面有空格(空格、制表符或换行符)的字母。

【讨论】:

  • 我建议至少 ?&lt;=\s - 前面有 white空格(即空格、制表符、不间断空格等)
【解决方案2】:

好吧,ToTitleCase每个单词的第一个字母转为大写,而其他所有字母转为小写。 Word 在 .Net 中是一个后续字母,唉,^ 不是一个字母,这就是为什么 TEST^S2 单词组成。

我们可以将单词重新定义为

  • 单词必须以字母开头
  • 单词可以包含字母、撇号'、抑扬符^和句号.

在这种情况下我们可以使用正则表达式

  using System.Text.RegularExpressions;

  ... 

  string source = "TEST^S CHECK по-русски (in RUSSIAN) it's a check! a.b.c.d";

  string result = Regex.Replace(source, @"\p{L}[\p{L}\^'\.]*",
    match => match.Value.Substring(0, 1).ToUpper() + match.Value.Substring(1).ToLower());

  Console.Write(result);

结果:

  Test^s Check По-Русски (In Russian) It's A Check! A.b.c.d

【讨论】:

    猜你喜欢
    • 2011-10-25
    • 2014-08-09
    • 2016-03-03
    • 1970-01-01
    • 2016-09-13
    • 2019-09-17
    • 1970-01-01
    • 2021-09-05
    • 2015-02-27
    相关资源
    最近更新 更多