web-dev-qa-db-ja.com

文字列内の非ASCII文字を削除します

var str="INFO] :谷���新道, ひば���ヶ丘2丁���, ひばりヶ���, 東久留米市 (Higashikurume)";

そして、私はすべての非ASCII文字を文字列から削除する必要があります、

strは "INFO](東久留米)"のみを含むことを意味します。

67
Dev

ASCIIの範囲は0〜127です。したがって、

str.replace(/[^\x00-\x7F]/g, "");
190
Zaffy

次のように、削除の肯定的なアサーションで行うこともできます。

textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");

これはユニコードを使用します。 Javascriptでは、正規表現のUnicodeを表現する場合、文字はエスケープシーケンス\u{xxxx}で指定されますが、フラグ'u'も必要です。正規表現にはフラグ'gu'があります。

これは、「ポジティブ」アサーションが削除する文字を表し、「ネガティブ」アサーションが削除しない文字を表すという意味で、「ポジティブなアサーション」と呼ばれます。多くの状況において、前の回答で述べた否定的な主張は、読者にとってより示唆的かもしれません。サーカムフレックス「^」は「not」を示し、範囲「\x00-\x7F」は「ascii」を示すため、両者は「not 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-Editor(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の3バイト(私の場合)として埋め込まれていますが、正規表現の命令は2バイトのUnicodeを使用する必要があります。実際、UTF-8の最大長は4バイトです。標準のASCIIエンコーディングをエスケープするために上位ビットを使用するため、Unicodeよりもコンパクトではありません。ここで説明します:

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

18
IAM_AL_X

次の正規表現を使用して、非ASCII文字を置き換えることができます

str = str.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '')

ただし、スペース、コロン、コンマはすべて有効なASCIIなので、結果は次のようになります。

> str
"INFO] :, , ,  (Higashikurume)"
13
Chris Taylor

ASCIIをアクセント付きで使用するには:

var str = str.replace(/[^\x00-\xFF]/g, "");
3
Eolia

これらの回答はどれもタブ、改行、キャリッジリターンを適切に処理せず、一部は拡張ASCIIおよびUnicodeを処理しません。これにより、タブと改行が保持されますが、ASCIIセットから制御文字とすべてが削除されます。 [このコードスニペットを実行]ボタンをクリックしてテストします。いくつかの新しいjavascriptがパイプに登場するので、将来(2020年以降?)\u{FFFFF}を実行する必要があるかもしれませんが、まだ

console.log("line 1\nline2 \n\ttabbed\nF̸̡̢͓̳̜̪̟̳̠̻̖͐̂̍̅̔̂͋͂͐l̸̢̹̣̤̙͚̱͓̖̹̻̣͇͗͂̃̈͝a̸̢̡̬͕͕̰̖͍̮̪̬̍̏̎̕͘ͅv̸̢̛̠̟̄̿i̵̮͌̑ǫ̶̖͓͎̝͈̰̹̫͚͓̠̜̓̈́̇̆̑͜ͅ".replace(/[\x00-\x08\x0E-\x1F\x7F-\uFFFF]/g, ''))
3
Jonathan

Googleで簡単に検索すると、StackOverflowに関する次の記事が返されます。

nodejs cryptoから返された文字列から非ASCII文字を削除

私は答えを信用しませんが、この正規表現を使用して非ASCII文字を置き換えることができます:

str.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '') ;
1
aaroncatlin