操作字符串:删除特殊字符 - 将所有带重音的字母更改为非重音字母

时间:2011-08-09 06:22:56

标签: c# regex

我正在使用asp.net 4和c#。

我有一个可以包含的字符串:

  • 特殊字符,例如:!“£$%& /()/#
  • 重音字母,例如:àòèù
  • 空格,如:“”(连续1次或更多次),

示例字符串:

#Hi this          is  rèally/ special strìng!!!

我想:

a)删除所有特殊字符,例如:

Hi this          is  rèally special strìng

b)将所有重音字母转换为NON Accented字母,例如:

Hi this          is  really special string

c)删除所有空格并用短划线( - )替换主题,如:

Hi-this-is-really-special-string

我的目标是创建一个适合URL路径的字符串,以获得更好的SEO。

任何想法如何使用正则表达式或其他技术?

感谢您的帮助!

3 个答案:

答案 0 :(得分:9)

与mathieu的答案类似,但更多为您定制的定制要求。此解决方案首先从输入字符串中删除特殊字符和变音符号,然后用短划线替换空格:

string s = "#Hi this          is  rèally/ special strìng!!!";
string normalized = s.Normalize(NormalizationForm.FormD);


StringBuilder resultBuilder = new StringBuilder();
foreach (var character in normalized)
{
    UnicodeCategory category = CharUnicodeInfo.GetUnicodeCategory(character);
    if (category == UnicodeCategory.LowercaseLetter
        || category == UnicodeCategory.UppercaseLetter
        || category == UnicodeCategory.SpaceSeparator)
        resultBuilder.Append(character);
}
string result = Regex.Replace(resultBuilder.ToString(), @"\s+", "-");

ideone.com看到它的实际效果。

答案 1 :(得分:3)

您应该看一下这个答案:Ignoring accented letters in string comparison

代码在这里:

static string RemoveDiacritics(string sIn)
{
  string sFormD = sIn.Normalize(NormalizationForm.FormD);
  StringBuilder sb = new StringBuilder();

  foreach (char ch in sFormD)
  {
    UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(ch);
    if (uc != UnicodeCategory.NonSpacingMark)
    {
      sb.Append(ch);
    }
  }

  return (sb.ToString().Normalize(NormalizationForm.FormC));
}

答案 2 :(得分:0)

对于RegularExpressions,我不是专家,但我怀疑它对这种计算有用。

对我来说,对输入字符的简单迭代就足够了:

List<char> specialChars = 
    new List<char>() { '!', '"', '£', '$', '%', '&', '/', '(', ')', '/', '#' };

string specialString = "#Hi this          is  rèally/ special strìng!!!";

System.Text.StringBuilder builder =
    new System.Text.StringBuilder(specialString.Length);

bool encounteredWhiteSpace = false;


foreach (char ch in specialString)
{
    char val = ch;

    if (specialChars.Contains(val))
        continue;

    switch (val)
    {
        case 'è':
            val = 'e'; break;
        case 'à':
            val = 'a'; break;
        case 'ò':
            val = 'o'; break;
        case 'ù':
        case 'ü':
            val = 'u'; break;
        case 'ı':
        case 'ì':
            val = 'i'; break;
    }

    if (val == ' ' || val == '\t')
    {
        encounteredWhiteSpace = true;
        continue;
    }

    if (encounteredWhiteSpace)
    {
        builder.Append('-');
        encounteredWhiteSpace = false;
    }

    builder.Append(val);
}

string result = builder.ToString();