删除string中的非ASCII字符
var str="INFO] :谷 新道, ひば ヶ丘2丁 , ひばりヶ , 東久留米市 (Higashikurume)";
我需要从string中删除所有非ASCII字符,
意味着str只包含“INFO”(Higashikurume)“;
ASCII在0到127之间,所以:
str.replace(/[^\x00-\x7F]/g, "");
您可以使用下面的正则expression式来replace非ASCII字符
str = str.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '')
但是,请注意,空格,冒号和逗号都是有效的ASCII,所以结果将是
> str "INFO] :, , , (Higashikurume)"
这也可以通过积极主张去除,如下所示:
textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");
这使用unicode。 在Javascript中,当为正则expression式表示unicode时,字符是用转义序列\u{xxxx}
指定的,但是也必须存在标志'u'
注意正则expression式有标志'gu'
。
我把这称为“积极主动的去除”,意思是“积极的”断言expression了要删除的字符,而“否定的”断言表示哪些字母不能删除。 在许多情况下,正如前面的答案所述的否定论断可能对读者更有启发性。 \x00-\x7F
“ ^
”表示“不”,范围\x00-\x7F
表示“ascii”,所以两者一起说“不ascii”。
textContent = textContent.replace(/[^\x00-\x7F]/g,"");
对于那些只关心英语的英语人士来说,这是一个很好的解决scheme,对于原来的问题来说也是一个很好的答案。 但是从更一般的angular度来看,不能总是接受假设“所有非ascii不好”的文化偏见。 对于使用非ascii的情况,偶尔需要删除,Unicode的正面说法更合适。
string的“length”属性为正值(非零),但看起来像(即打印为)空string时,一个很好的指示是将零宽度非打印字符embedded到string中。 例如,我在Chromedebugging器中显示了一个名为“textContent”的variables:
> textContent "" > textContent.length 7
这促使我想看看那个string是什么。
> encodeURI(textContent) "%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B"
这个字节序列似乎在一些Unicode字符的家族中,这些字符被文字处理器插入到文档中,然后进入数据字段。 最常见的是,这些符号出现在文档的末尾。 可以通过CK-Editor(CKEditor)插入零宽度空间"%E2%80%8B"
。
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
请注意,虽然embedded字符的编码是UTF-8,但正则expression式中的编码不是。 虽然字符被embedded到UTF-8的三个字节(在我的情况下),但正则expression式中的指令必须使用两个字节的Unicode。 实际上,UTF-8可以长达四个字节; 它比Unicode更紧凑,因为它使用高位(或位)来避免标准的ASCII编码。 这是在这里解释:
要使用带有重音的ASCII:
var str = str.replace(/[^\x00-\xFF]/g, "");
快速的Googlesearch返回这篇文章在StackOverflow:
修剪nodejs crypto返回的string中的非ASCII字符
我不会拿出答案,但是,你可以用这个正则expression式replace非ASCII字符:
str.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '') ;