Ответ 1
string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);
Как вы можете вырезать не-ASCII-символы из строки? (в С#)
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 до U)
Вдохновленный philcruz Regular Expression solution, я сделал чистое решение 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();
}
Это непроверенный код.
нет необходимости в регулярном выражении. просто используйте кодировку...
sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));
Я нашел следующий слегка измененный диапазон, полезный для разбора блоков комментариев из базы данных, это означает, что вам не придется бороться с символами табуляции и escape-кода, что может привести к расстройству поля CSV.
parsememo = Regex.Replace(parsememo, @"[^\u001F-\u007F]", string.Empty);
Если вы хотите избежать других специальных символов или определенной пунктуации, отметьте таблицу ascii
Это не оптимальный по производительности, но довольно простой подход Linq:
string strippedString = new string(
yourString.Where(c => c <= sbyte.MaxValue).ToArray()
);
Недостатком является то, что все "выживающие" символы сначала помещаются в массив типа char[]
, который затем отбрасывается после того, как конструктор string
больше не использует его.
Я пришел сюда, чтобы найти решение для расширенных символов ascii, но не смог найти его. Самое близкое, что я нашел, - это решение bzlm. Но это работает только для кода ASCII до 127 (очевидно, вы можете заменить тип кодировки в своем коде, но я думаю, что это было немного сложно понять. Следовательно, совместное использование этой версии). Здесь решение, которое работает для расширенных кодов ASCII, т.е. до 255, которое является ISO 8859-1
Он находит и вырезает символы не-ascii (больше 255)
Dim str1 as String= "â, ??î or ôu🕧� n☁i✑💴++$-💯♓!🇪🚑🌚‼⁉4⃣od;/⏬'®;😁☕😁:☝)😁😁///😍[email protected]#"
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;/';:)///[email protected]#$%^yz:
Здесь рабочая скрипка для кода
Замените кодировку в соответствии с требованием, остальные должны оставаться неизменными.
Я использовал это выражение регулярного выражения:
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\\:_\- ]", "")
Это должны быть все символы, разрешенные для имен файлов.