Для тех из нас, кого RegEx бросил вызов, не могли бы вы написать на английском языке свой шаблон RegEx. Другими словами, «^ делает это» и т. Д.
Метро Смурф
47
@Metro Smurf ^ - это не оператор. Он говорит регулярному выражению найти все, что не соответствует, вместо всего, что соответствует. \ U #### - \ u #### говорит, какие символы совпадают. \ U0000- \ u007F является эквивалентом первых 255 символов в utf-8 или unicode, которые всегда являются символами ascii. Таким образом, вы соответствуете каждому не ascii символу (из-за не) и делаете замену на все, что соответствует.
Гордон Такер
41
Диапазон для печатаемых символов - 0020-007E, для людей, которые ищут регулярные выражения для замены непечатаемых символов
Мубашар
1
@GordonTucker \ u0000- \ u007F является эквивалентом первых 127 символов в utf-8 или unicode, а НЕ первых 225. См. Таблицу
full_prog_full
4
@full_prog_full Именно поэтому я примерно через минуту ответил себе, исправляя себя, говоря, что это 127, а не 255. :)
Гордон Такер
125
Вот чистое решение .NET, которое не использует регулярные выражения:
Это может выглядеть громоздким, но это должно быть интуитивно понятно. Он использует кодировку .NET ASCII для преобразования строки. UTF8 используется во время преобразования, потому что он может представлять любой из исходных символов. Он использует EncoderReplacementFallback для преобразования любого не-ASCII символа в пустую строку.
Отлично! Я использую это для очистки строки перед сохранением в RTF-документ. Очень ценится. Гораздо проще понять, чем версия Regex.
Натан Пратер
21
Вам правда легче понять? Для меня все вещи, которые не очень актуальны (запасные варианты, преобразования в байты и т. Д.), Отвлекают внимание от того, что на самом деле происходит.
bzlm
21
Это все равно, что сказать, что отвертки слишком запутаны, поэтому я просто использую молоток.
Брэндон
8
@ Брэндон, на самом деле, этот метод не делает работу лучше, чем другие методы. Таким образом, аналогия будет использовать обычную отвертку вместо оригинальной iScrewDriver Deluxe 2000. :)
bzlm
10
Одним из преимуществ является то, что я могу легко заменить ASCII на ISO 8859-1 или другую кодировку :)
Я даже не осознавал, что это возможно, но для меня это намного лучшее решение. Я собираюсь добавить эту ссылку в комментарий к этому вопросу, чтобы другим людям было легче его найти. Спасибо!
publicstaticstringPureAscii(thisstring source,char nil =' '){var min ='\u0000';var max ='\u007F';return source.Select(c => c < min ? nil : c > max ? nil : c).ToText();}publicstaticstringToText(thisIEnumerable<char> source){var buffer =newStringBuilder();foreach(var c in source)
buffer.Append(c);return buffer.ToString();}
Для тех, кто этого не понял, это решение на основе LINQ для C # 4.0. :)
7
Вместо отдельного метода ToText (), как насчет замены строки 3 функции PureAscii () на: возвращение новой строки (source.Select (c => c <min? Nil: c> max? Nil: c) .ToArray ()) ;
Агентнега
Или, возможно, ToText as: return (новая строка (источник)). ToArray () - в зависимости от того, что работает лучше всего. Все еще хорошо иметь ToText в качестве метода расширения - свободный / конвейерный стиль. :-)
Бент Расмуссен
Этот код заменяет символы, не входящие в ASCII, пробелом. Чтобы удалить их, измените Select на Where:return new string( source.Where( c => c >= min && c <= max ).ToArray() );
Foozinator
@Foozinator Этот код позволяет вам указать, каким символом заменять не-ASCII символы. По умолчанию он использует пробел, но если он называется как .PureASCII (Char.MinValue), он заменит все не-ASCII на '\ 0' - что по-прежнему точно не удаляет их, но приводит к аналогичным результатам.
Ульфий
5
нет необходимости в регулярных выражениях. просто используйте кодировку ...
Я обнаружил, что следующий слегка измененный диапазон полезен для анализа блоков комментариев из базы данных, это означает, что вам не придется бороться с символами табуляции и экранирования, которые могут привести к нарушению поля CSV.
Если кто-то еще не заметил другие комментарии, печатные символы на самом деле являются @ "[^ \ u0020- \ u007E]". Вот ссылка для просмотра таблицы, если вам интересно: asciitable.com
scradam
3
Я пришел сюда в поисках решения для расширенных символов ascii, но не смог его найти. Самое близкое, что я нашел, - это решение bzlm . Но это работает только для кода ASCII до 127 (очевидно, вы можете заменить тип кодирования в его коде, но я думаю, что это было немного сложно понять. Следовательно, поделиться этой версией). Вот решение, которое работает для расширенных кодов ASCII, т.е. до 255, что является ISO 8859-1
Он находит и удаляет символы не-ascii (больше 255)
Dim str1 asString="â, ??î or ôu🕧� n☁i✑💴++$-💯♓!🇪🚑🌚‼⁉4⃣od;/⏬'®;😁☕😁:☝)😁😁///😍1!@#"Dim extendedAscii AsEncoding=Encoding.GetEncoding("ISO-8859-1",NewEncoderReplacementFallback(String.empty),NewDecoderReplacementFallback())Dim extendedAsciiBytes()AsByte= extendedAscii.GetBytes(str1)Dim str2 AsString= extendedAscii.GetString(extendedAsciiBytes)
console.WriteLine(str2)'Output : â, ??î or ôu ni++$-!‼⁉4od;/';:)///1!@#$%^yz:
Единственный, который работал, чтобы удалить ТОЛЬКО Ω из этой строки "Ω c ç ã". Большое спасибо!
Рафаэль Араужо
2
Это не оптимальная производительность, но довольно простой подход Linq:
string strippedString =newstring(
yourString.Where(c => c <=sbyte.MaxValue).ToArray());
Недостатком является то, что все «выживающие» символы сначала помещаются в массив типа, char[]который затем выбрасывается после того, как stringконструктор больше не использует его.
Ответы:
источник
Вот чистое решение .NET, которое не использует регулярные выражения:
Это может выглядеть громоздким, но это должно быть интуитивно понятно. Он использует кодировку .NET ASCII для преобразования строки. UTF8 используется во время преобразования, потому что он может представлять любой из исходных символов. Он использует EncoderReplacementFallback для преобразования любого не-ASCII символа в пустую строку.
источник
Я считаю, что MonsCamus имел в виду:
источник
Если вы хотите не вырезать, а на самом деле конвертировать символы латинского акцентирования в символы без акцента, взгляните на этот вопрос: как мне перевести 8-битные символы в 7-битные символы? (то есть от Ü до U)
источник
Вдохновленный решением регулярных выражений philcruz , я создал чистое решение LINQ
Это непроверенный код.
источник
return new string( source.Where( c => c >= min && c <= max ).ToArray() );
нет необходимости в регулярных выражениях. просто используйте кодировку ...
источник
????nacho??
когда я пытался:たまねこnachoなち
в моно 3,4Я обнаружил, что следующий слегка измененный диапазон полезен для анализа блоков комментариев из базы данных, это означает, что вам не придется бороться с символами табуляции и экранирования, которые могут привести к нарушению поля CSV.
Если вы хотите избежать других специальных символов или знаков препинания, проверьте таблицу ascii
источник
Я пришел сюда в поисках решения для расширенных символов ascii, но не смог его найти. Самое близкое, что я нашел, - это решение bzlm . Но это работает только для кода ASCII до 127 (очевидно, вы можете заменить тип кодирования в его коде, но я думаю, что это было немного сложно понять. Следовательно, поделиться этой версией). Вот решение, которое работает для расширенных кодов ASCII, т.е. до 255, что является ISO 8859-1
Он находит и удаляет символы не-ascii (больше 255)
Вот рабочая скрипка для кода
Замените кодировку согласно требованию, остальные должны остаться прежними.
источник
Это не оптимальная производительность, но довольно простой подход Linq:
Недостатком является то, что все «выживающие» символы сначала помещаются в массив типа,
char[]
который затем выбрасывается после того, какstring
конструктор больше не использует его.источник
Я использовал это регулярное выражение:
источник
Я использую это регулярное выражение, чтобы отфильтровать плохие символы в имени файла.
Это должны быть все символы, разрешенные для имен файлов.
источник