如何从字符串中剔除非ASCII字符?(使用C#)
string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);
^
是非运算符,它告诉正则表达式查找与之不匹配的所有内容而不是匹配的内容。 \u####-\u####
表示哪些字符匹配。 \u0000-\u007F
等同于utf-8或unicode中的前128个字符,它们总是ASCII字符。因此,你可以匹配每个非ASCII字符(由于非运算符),并对所有匹配项进行替换。
(如Gordon Tucker于2009年12月11日21:11在评论中解释的那样)
这里是一个纯.NET解决方案,不使用正则表达式:
string inputString = "Räksmörgås";
string asAscii = Encoding.ASCII.GetString(
Encoding.Convert(
Encoding.UTF8,
Encoding.GetEncoding(
Encoding.ASCII.EncodingName,
new EncoderReplacementFallback(string.Empty),
new DecoderExceptionFallback()
),
Encoding.UTF8.GetBytes(inputString)
)
);
这看起来可能有点繁琐,但应该很直观。它使用.NET ASCII编码将字符串转换。在转换过程中使用UTF8,因为它可以表示原始字符中的任何一个。它使用EncoderReplacementFallback将任何非ASCII字符转换为空字符串。
我相信MonsCamus的意思是:
parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty);
在受到philcruz的正则表达式解决方案启发下,我写了一个纯LINQ解决方案。
public static string PureAscii(this string source, char nil = ' ')
{
var min = '\u0000';
var max = '\u007F';
return source.Select(c => c < min ? nil : c > max ? nil : c).ToText();
}
public static string ToText(this IEnumerable<char> source)
{
var buffer = new StringBuilder();
foreach (var c in source)
buffer.Append(c);
return buffer.ToString();
}
这是未经测试的代码。
return new string(source.Where(c => c >= min && c <= max).ToArray());
- Foozinatorreturn source.Where(c => c >= min && c <= max).Aggregate(new StringBuilder(), (sb, s) => sb.Append(s), sb => sb.ToString());
- Joakim M. H.Dim str1 as String= "â, ??î or ôu� n☁i✑++$-♓!‼⁉4⃣od;/⏬'®;☕:☝)///1!@#"
Dim extendedAscii As Encoding = Encoding.GetEncoding("ISO-8859-1",
New EncoderReplacementFallback(String.empty),
New DecoderReplacementFallback())
Dim extendedAsciiBytes() As Byte = extendedAscii.GetBytes(str1)
Dim str2 As String = extendedAscii.GetString(extendedAsciiBytes)
console.WriteLine(str2)
'Output : â, ??î or ôu ni++$-!‼⁉4od;/';:)///1!@#$%^yz:
这里有一个工作的代码示例。
根据要求替换编码,其余部分保持不变。
parsememo = Regex.Replace(parsememo, @"[^\u001F-\u007F]", string.Empty);
如果你想避免其他特殊字符或特定标点符号,请查看ascii表
sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));
????nacho??
。 - nacho4dstring strippedString = new string(
yourString.Where(c => c <= sbyte.MaxValue).ToArray()
);
char[]
类型的数组中,然后在string
构造函数不再使用它后被丢弃。Regex.Replace(directory, "[^a-zA-Z0-9\\:_\- ]", "")