var str="INFO] :谷���新道, ひば���ヶ丘2丁���, ひばりヶ���, 東久留米市 (Higashikurume)";
and i need to remove all non-ascii character from string,
means str only contain "INFO] (Higashikurume)";
可以使用以下正则表达式替换非 ASCII 字符
str = str.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '')
但是,请注意,空格、冒号和逗号都是有效的 ASCII,因此结果将是
> str "INFO] :, , , (Higashikurume)"
ASCII 在0到127之间,因此:
str.replace(/[^\x00-\x7F]/g, "");
带重音使用 ASCII:
var str = str.replace(/[^\x00-\xFF]/g, "");
它也可以通过一个积极的移除主张来实现,如下:
textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");
这使用 Unicode。在 Javascript 中,当为正则表达式表达 unicode 时,字符是用转义序列 \u{xxxx}指定的,但是也必须显示标志 'u'; 注意,正则表达式有标志 'gu'。
\u{xxxx}
'u'
'gu'
我称之为“移除的积极断言”,意思是“积极”断言表示要移除哪些字符,而“消极”断言表示不要移除哪些字母。在许多情况下,否定的断言,如前面的答案所述,可能对读者更具暗示性。回旋曲线“ ^”表示“不”,范围“ \x00-\x7F”表示“ ascii”,所以两者一起表示“ not ascii”
^
\x00-\x7F
textContent = textContent.replace(/[^\x00-\x7F]/g,"");
对于那些只关心英语的英语使用者来说,这是一个很好的解决方案,对于最初的问题也是一个很好的答案。但是在一个更普遍的背景下,人们不能总是接受文化偏见的假设“所有非 ASCII 都是坏的。”对于使用 non-ascii 但偶尔需要去掉它的上下文,Unicode 的肯定断言更适合。
当字符串的“ length”属性为正(非零) ,但看起来像(即打印为)一个空字符串时,可以很好地说明字符串中嵌入了零宽度的非打印字符。例如,我在 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)插入。
"%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
注意,虽然嵌入字符的编码是 UTF-8,但正则表达式中的编码不是。虽然字符以三个字节(在我的例子中)的 UTF-8嵌入在字符串中,但是正则表达式中的指令必须使用两个字节的 Unicode。事实上,UTF-8可以长达4个字节; 它不如 Unicode 紧凑,因为它使用高位(或位)来转义标准的 ascii 编码。这里有解释:
Https://en.wikipedia.org/wiki/utf-8
这些答案都不能正确处理制表符、换行符、回车符,有些答案不能处理扩展的 ASCII 和 unicode。 这将保持制表符和换行符,但删除控制字符和 ASCII 集以外的任何东西。单击“运行此代码段”按钮进行测试。将来(2020 + ?)会有一些新的 javascript 出现你可能必须做 \u{FFFFF},但不是现在
\u{FFFFF}
console.log("line 1\nline2 \n\ttabbed\nF̸̡̢͓̳̜̪̟̳̠̻̖͐̂̍̅̔̂͋͂͐l̸̢̹̣̤̙͚̱͓̖̹̻̣͇͗͂̃̈͝a̸̢̡̬͕͕̰̖͍̮̪̬̍̏̎̕͘ͅv̸̢̛̠̟̄̿i̵̮͌̑ǫ̶̖͓͎̝͈̰̹̫͚͓̠̜̓̈́̇̆̑͜ͅ".replace(/[\x00-\x08\x0E-\x1F\x7F-\uFFFF]/g, ''))
str = str.replace(/[\u{0080}-\u{10FFFF}]/gu,"");