Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 操作字符串:删除特殊字符-将所有重音字母更改为非重音字母_C#_Regex - Fatal编程技术网

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

C# 操作字符串:删除特殊字符-将所有重音字母更改为非重音字母,c#,regex,C#,Regex,我正在使用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 b) 将所

我正在使用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
b) 将所有重音字母转换为非重音字母,如:

Hi this          is  rèally special strìng
Hi this          is  really special string
c) 删除所有空白并用破折号(-)替换主题,如:

我的目标是创建一个字符串为更好的搜索引擎优化的URL路径适合

你知道如何使用正则表达式或其他技术吗


感谢您在这方面的帮助!

对于正则表达式,我不是专家,但我怀疑它对此类计算是否有用

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

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();
List specialChars=
新列表();
string specialString=“#你好,我是rèally/special strìng!!!”;
System.Text.StringBuilder=
新的System.Text.StringBuilder(specialString.Length);
bool遇到空白=false;
foreach(特殊字符串中的字符)
{
char-val=ch;
if(特殊字符包含(val))
继续;
开关(val)
{
案例“è”:
val='e';break;
案例“a”:
val='a';break;
案例“ò”:
val='o';break;
案例“ù”:
案例'u':
val='u';break;
案例“ı”:
案例“ì”:
val='i';break;
}
如果(val=''| val='\t')
{
遇到空白=true;
继续;
}
if(遇到空格)
{
builder.Append('-');
遇到空白=false;
}
builder.Append(val);
}
字符串结果=builder.ToString();

你应该看看这个答案:

代码如下:

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

与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+", "-");

请参见。

可能与感谢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()仍然没有提供其方法名称所暗示的基本级别的功能。