ToTitleCase()方法不适用于特殊字符

问题描述 投票:1回答:2

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

下面是代码和预期结果

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

预期结果:测试^ s检查但是结果以Test ^ S Check的形式出现,其中“ S”在特殊字符后转换为大写^

仍然有将转换转换为预期结果的方法

c# cultureinfo case-conversion
2个回答
2
投票

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

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

[^[a-z]|(?<=\s)[a-z]将匹配字符串开头的字母,并在字母前加上空格(空格,制表符或换行符)。


1
投票

嗯,ToTitleCase每个单词的第一个字母变为大写,而所有其他字母都变为小写。用.Net表示的Word后续字母,而且,^不是字母,这就是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
© www.soinside.com 2019 - 2024. All rights reserved.