字符串规范化

时间:2009-03-03 01:48:16

标签: c# .net-3.5 string normalization

我正在编写一些需要进行字符串规范化的代码,我想将一个给定的字符串变成一个驼峰式的表示形式(好吧,至少是最好的猜测)。例如:

"the quick brown fox" => "TheQuickBrownFox"
"the_quick_brown_fox" => "TheQuickBrownFox"
"123The_quIck bROWN FOX" => "TheQuickBrownFox"
"the_quick brown fox 123" => "TheQuickBrownFox123"
"thequickbrownfox" => "Thequickbrownfox"

我认为你应该能够从这些例子中得到这个想法。我想删除所有特殊字符(',“,!,@ ,.等),大写每个单词(单词由空格,_或 - 定义)和任何引导数字下降(尾随/内部没问题,但这个要求并不重要,具体取决于难度)。

我正在努力找出实现这一目标的最佳方法。我的第一个猜测是使用正则表达式,但我的正则表达式技巧最好,所以我不知道从哪里开始。

我的另一个想法是循环和解析数据,比如将其分解为 words ,解析每个数据,然后重建字符串。

还是有另外一种方法可以解决它吗?

5 个答案:

答案 0 :(得分:3)

在Microsoft.VisualBasic命名空间中使用Strings.StrConv的简单解决方案怎么样? (不要忘记将项目引用添加到Microsoft.VisualBasic):

using System;
using VB = Microsoft.VisualBasic;


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(VB.Strings.StrConv("QUICK BROWN", VB.VbStrConv.ProperCase, 0));
            Console.ReadLine();
        }
    }
}

答案 1 :(得分:1)

此正则表达式匹配所有单词。然后,我们Aggregate使用一个方法将第一个字符大写,ToLower是字符串的其余部分。

Regex regex = new Regex(@"[a-zA-Z]*", RegexOptions.Compiled);

private string CamelCase(string str)
{
    return regex.Matches(str).OfType<Match>().Aggregate("", (s, match) => s + CamelWord(match.Value));
}

private string CamelWord(string word)
{
    if (string.IsNullOrEmpty(word))
        return "";

    return char.ToUpper(word[0]) + word.Substring(1).ToLower();
}

顺便说一下,这种方法忽略了数字。要添加它们,您可以将正则表达式更改为@"[a-zA-Z]*|[0-9]*",但我还没有对其进行测试。

答案 2 :(得分:1)

任何涉及匹配特定字符的解决方案可能无法与某些字符编码一起使用,特别是在使用Unicode表示时,其中包含数十个空格字符,数千个“符号”,数千个标点字符,数千个“字母”等等。尽可能使用内置的Unicode感知功能会更好。就什么是“特殊角色”而言,你可以根据Unicode categories来决定。例如,它将包括“标点符号”,但它是否包含“符号”?

ToLower(),IsLetter()等应该没问题,并考虑Unicode中所有可能的字母。与破折号和斜杠匹配应该考虑Unicode中的几十个空格和短划线字符。

答案 3 :(得分:1)

你可以wear ruby slippers to work:)

def camelize str
  str.gsub(/^[^a-zA-z]*/, '').split(/[^a-zA-Z0-9]/).map(&:capitalize).join
end

答案 4 :(得分:0)

认为尝试它会很有趣,这就是我想出的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder();
            string sentence = "123The_quIck bROWN FOX1234";

            sentence = sentence.ToLower();

            char[] s = sentence.ToCharArray();

            bool atStart = true;
            char pChar = ' ';

            char[] spaces = { ' ', '_', '-' };
            char a;
            foreach (char c in s)
            {
                if (atStart && char.IsDigit(c)) continue;

                if (char.IsLetter(c))
                {
                    a = c;
                    if (spaces.Contains(pChar))
                        a = char.ToUpper(a);
                    sb.Append(a);
                    atStart = false;
                }
                else if(char.IsDigit(c))
                {
                    sb.Append(c);
                }
                pChar = c;
            }

            Console.WriteLine(sb.ToString());
            Console.ReadLine();
        }
    }
}