我正在使用asp.net 4和c#。
我有一个可以包含的字符串:
示例字符串:
#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。
任何想法如何使用正则表达式或其他技术?
感谢您的帮助!
答案 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();