删除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 &#8203; zero-width-space "%E2%80%8E" EC 80 8E U 200E &#8206; left-to-right-mark "%E2%80%8F" EC 80 8F U 200F &#8207; 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编码。 这是在这里解释:

https://en.wikipedia.org/wiki/UTF-8

要使用带有重音的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, '') ;