处理字符串:去除特殊字符 - 将所有重音字母改为非重音字母

4
我正在使用asp.net 4和c#。
我有一个字符串,它可以包含:
  • 特殊字符,例如:!"£$%&/()/#
  • 重音字母,例如:àòèù
  • 空格,例如:" "(1个或多个连续的空格),
示例字符串:
#Hi this          is  rèally/ special strìng!!!

我想要:
a) 去除所有特殊字符,例如:
Hi this          is  rèally special strìng

将所有带重音的字母转换为不带重音的字母,例如:
Hi this          is  really special string

c) 去除所有空格并用短横线(-)替换,例如:
Hi-this-is-really-special-string

我的目标是创建一个适用于 URL 路径的字符串,以实现更好的 SEO。
有没有任何想法可以使用正则表达式或其他技术来实现呢?
感谢您对此的帮助!

可能是重复的问题:在字符串比较中忽略重音字母 - GvS
3个回答

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上实际查看它的使用情况。

感谢Jens提供的代码。最后一个问题,如果我的字符串被编码为这样:%23Hi%20this%20%20%20%20%20%20%20%20is%20%20r%C3%A8ally /%20special%20str%C3%ACng !!!在使用您的代码之前,如何解码?感谢您对此的帮助! - GibboK
你可以使用 System.Web 程序集中的 HttpUtility.UrlDecode。 - Jens
很好的答案。遗憾的是,URLEncode()仍然没有提供其方法名称所暗示的基本级功能。 - Eric

3

您应该查看这个答案:忽略带重音字母的字符串比较

代码如下:

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));
}

0

关于正则表达式,我不是专家,但我怀疑它对于这种计算有用。

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

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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接