2

我有以下代码将字符串转换为 TitleCase。我想为此创建一个例外,以便如果输入的字符串按顺序找到确切的字符,它将忽略它并继续转换字符串的其余部分。例如。如果字符串的一部分包含: ABC 作为规则我想忽略它并继续在 TitleCase 中转换字符串的其余部分:

public string ConvertToTitleCase(string input)
    {
        char[] chars = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(input.ToLower()).ToCharArray();

        for (int i = 0; i + 1 < chars.Length; i++)
        {

            if ((chars[i].Equals('\'')) ||
                (chars[i].Equals('-')))
            {
                chars[i + 1] = Char.ToUpper(chars[i + 1]);
            }
        }
        return new string(chars);
    }

有任何想法吗?

4

3 回答 3

1

通常,在这种情况下,您所做的不是逐个字符地枚举,而是将字符串分成几部分(可能通过正则表达式,或者以某种方式,细节并不重要),分别处理每个部分(大写每个部分的第一个字符)和加入一切。

这种情况下的所有例外都只是这些你不接触的“部分”。

所以算法是:

  • 将字符串分解为标记
  • 枚举令牌和进程(如果是异常则忽略)
  • 将标记连接回字符串。

祝你好运 :)

于 2012-02-10T09:13:54.240 回答
0

你应该尝试这样的事情,使用MatchEvaluator

return Regex.Replace(input,
                     @"\S+",
                     (match) =>
                     {
                             var word = match.Value;

                             var formatException = yourListOfTitleCaseExceptions.FirstOrDefault(e => e.Trim().Equals(word, StringComparison.InvariantCultureIgnoreCase));

                                    if (formatException == null)
                                    {
                                        Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(word.ToLower())
                                    }

                                    return formatException.Trim();

                                });

这将拆分单词,检查您所做的例外列表并忽略标题大小写它们。如果找不到该单词,它将按预期使用标题大小写。如果发现异常,将返回未触及的单词。

于 2012-02-10T09:34:29.673 回答
0

这就是你所需要的

       private string ConvertToTitleCase(string input, string ignore) {
            var lcSB = new StringBuilder();
            var lcStart = 0;
            while (lcStart < input.Length) {
                var lcNext = input.IndexOf(ignore, lcStart);
                if (lcNext < 0)
                    lcNext = input.Length;
                lcSB.Append(input.Substring(lcStart, lcNext - lcStart).ToUpper());
                if (lcNext < input.Length)
                    lcSB.Append(ignore);
                lcStart = lcNext + ignore.Length;
            }
            return lcSB.ToString();
        }
于 2012-02-10T09:46:10.617 回答