Відповіді:
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, у порожню рядок.
Якщо ви хочете не роздягатись, а фактично перетворювати латинські акценти на символи без акценту, погляньте на це питання: Як я перекладу 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 upto 127 (очевидно, ви можете замінити тип кодування в його коді, але я думаю, що це було трохи складно для розуміння. Отже, поділитися цією версією). Ось рішення, яке працює для розширених ASCII-кодів, тобто до 255, що є ISO 8859-1
Він знаходить і викреслює символи, що не належать до асоцій (більше 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\\:_\- ]", "")
Це повинні бути всі символи, дозволені для імен файлів.