【问题标题】:Manipulating a String: Removing special characters - Change all accented letters to non accented操作字符串:删除特殊字符 - 将所有重音字母更改为非重音字母
【发布时间】:2011-10-22 23:00:44
【问题描述】:

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

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

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

示例字符串:

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

我想:

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

Hi this          is  rèally special strìng

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

Hi this          is  really special string

c) 删除所有空格并用破折号 (-) 替换主题,例如:

Hi-this-is-really-special-string

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

知道如何使用正则表达式或其他技术来做到这一点吗?

感谢您对此的帮助!

【问题讨论】:

标签: c# regex


【解决方案1】:

与 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%20%20%20is%20%20r%C3%A8ally/%20special%20str %C3%ACng!!!在您的代码中使用之前如何解码?感谢您对此的帮助!
  • 您可以使用 System.Web 程序集中的 HttpUtility.UrlDecode。
  • 很好的答案。遗憾的是 URLEncode() 仍然没有提供其方法名称所暗示的基本级别的功能。
【解决方案2】:

你应该看看这个答案: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));
}

【讨论】:

    【解决方案3】:

    我不是正则表达式方面的专家,但我怀疑它对这种计算是否有用。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 2014-04-26
      相关资源
      最近更新 更多