Ответы:
string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);
Вот чистое решение .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);
Если вы хотите не вырезать, а на самом деле конвертировать символы латинского акцентирования в символы без акцента, взгляните на этот вопрос: как мне перевести 8-битные символы в 7-битные символы? (то есть от Ü до U)
Вдохновленный решением регулярных выражений 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() );
нет необходимости в регулярных выражениях. просто используйте кодировку ...
sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));
????nacho??
когда я пытался: たまねこnachoなち
в моно 3,4
Я обнаружил, что следующий слегка измененный диапазон полезен для анализа блоков комментариев из базы данных, это означает, что вам не придется бороться с символами табуляции и экранирования, которые могут привести к нарушению поля CSV.
parsememo = Regex.Replace(parsememo, @"[^\u001F-\u007F]", string.Empty);
Если вы хотите избежать других специальных символов или знаков препинания, проверьте таблицу ascii
Я пришел сюда в поисках решения для расширенных символов ascii, но не смог его найти. Самое близкое, что я нашел, - это решение bzlm . Но это работает только для кода ASCII до 127 (очевидно, вы можете заменить тип кодирования в его коде, но я думаю, что это было немного сложно понять. Следовательно, поделиться этой версией). Вот решение, которое работает для расширенных кодов ASCII, т.е. до 255, что является ISO 8859-1
Он находит и удаляет символы не-ascii (больше 255)
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:
Замените кодировку согласно требованию, остальные должны остаться прежними.
Это не оптимальная производительность, но довольно простой подход Linq:
string strippedString = new string(
yourString.Where(c => c <= sbyte.MaxValue).ToArray()
);
Недостатком является то, что все «выживающие» символы сначала помещаются в массив типа, char[]
который затем выбрасывается после того, как string
конструктор больше не использует его.
Я использовал это регулярное выражение:
string s = "søme string";
Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0);
return regex.Replace(s, "");
Я использую это регулярное выражение, чтобы отфильтровать плохие символы в имени файла.
Regex.Replace(directory, "[^a-zA-Z0-9\\:_\- ]", "")
Это должны быть все символы, разрешенные для имен файлов.