var str="INFO] :谷���新道, ひば���ヶ丘2丁���, ひばりヶ���, 東久留米市 (Higashikurume)";
и мне нужно удалить все символы не-ascii из строки,
означает, что str содержит только "INFO" (Higashikurume) ";
var str="INFO] :谷���新道, ひば���ヶ丘2丁���, ひばりヶ���, 東久留米市 (Higashikurume)";
и мне нужно удалить все символы не-ascii из строки,
означает, что str содержит только "INFO" (Higashikurume) ";
ASCII находится в диапазоне от 0 до 127, поэтому:
str.replace(/[^\x00-\x7F]/g, "");
Вы можете использовать следующее регулярное выражение для замены символов, отличных от ASCII
str = str.replace(/[^A-Za-z 0-9 \.,\?""[email protected]#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '')
Однако обратите внимание, что пробелы, двоеточия и запятые все допустимы ASCII, поэтому результат будет
> str
"INFO] :, , , (Higashikurume)"
Это также можно сделать с положительным утверждением удаления, например:
textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");
В этом случае используется unicode. В Javascript при выражении юникода для регулярного выражения символы указываются с помощью escape-последовательности \u{xxxx}
, но также должен присутствовать флаг 'u'
; обратите внимание, что в regex есть флаги 'gu'
.
Я назвал это "положительным утверждением удаления" в том смысле, что "положительное" утверждение выражает, какие символы удалять, а "отрицательное" утверждение выражает, какие буквы не удалять. Во многих контекстах негативное утверждение, как указано в предыдущих ответах, может быть более наглядным для читателя. Огибающий "^
" говорит "нет", а диапазон \x00-\x7F
говорит "ascii", поэтому оба вместе говорят "не ascii".
textContent = textContent.replace(/[^\x00-\x7F]/g,"");
Это отличное решение для говорящих на английском языке, которые интересуются только английским языком, а также прекрасный ответ на оригинальный вопрос. Но в более общем контексте нельзя всегда принимать культурную предвзятость, предполагая, что "все не-ascii - это плохо". Для контекстов, в которых используется не-ascii, но иногда их необходимо удалить, положительное утверждение Unicode лучше подходит.
Хорошая индикация того, что нуль-ширина, непечатаемые символы встроены в строку, когда свойство "длина" строки является положительным (отличным от нуля), но выглядит как (например, печатает как) пустую строку. Например, я обнаружил это в отладчике Chrome, для переменной с именем "textContent":
> textContent
""
> textContent.length
7
Это побудило меня посмотреть, что было в этой строке.
> encodeURI(textContent)
"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B"
Эта последовательность байтов, похоже, находится в семействе некоторых символов Unicode, которые вставляются текстовыми процессорами в документы, а затем попадают в поля данных. Чаще всего эти символы встречаются в конце документа. Пустое пространство "%E2%80%8B"
может быть вставлено CK-редактором (CKEditor).
encodeURI() UTF-8 Unicode html Meaning
----------- -------- ------- ------- -------------------
"%E2%80%8B" EC 80 8B U 200B ​ zero-width-space
"%E2%80%8E" EC 80 8E U 200E ‎ left-to-right-mark
"%E2%80%8F" EC 80 8F U 200F ‏ right-to-left-mark
Некоторые ссылки на них:
http://www.fileformat.info/info/unicode/char/200B/index.htm
https://en.wikipedia.org/wiki/Left-to-right_mark
Обратите внимание, что хотя кодирование встроенного символа является UTF-8, кодирование в регулярном выражении не является. Хотя символ встроен в строку как три байта (в моем случае) UTF-8, инструкции в регулярном выражении должны использовать двухбайтовый Unicode. Фактически UTF-8 может иметь длину до четырех байтов; он менее компактен, чем Unicode, потому что он использует высокий бит (или бит), чтобы избежать стандартного кодирования ascii. Это объясняется здесь:
Чтобы использовать ASCII с акцентами:
var str = str.replace(/[^\x00-\xFF]/g, "");
Быстрый поиск Google возвращает эту статью в StackOverflow:
обрезать не-ascii символы из строки, возвращаемой nodejs crypto
Я не буду отвечать за ответ, однако вы можете заменить символы не-ascii с помощью этого регулярного выражения:
str.replace(/[^A-Za-z 0-9 \.,\?""[email protected]#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '') ;