var str="INFO] :谷���新道, ひば���ヶ丘2丁���, ひばりヶ���, 東久留米市 (Higashikurume)";
文字列からASCII以外の文字をすべて削除する必要があります。
strには「INFO](東久留米)」のみが含まれていることを意味します。
回答:
これは、次のように、削除を積極的に表明して行うこともできます。
textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");
これはユニコードを使用します。Javascriptでは、正規表現のUnicodeを表現する場合、文字はエスケープシーケンスで指定されます\u{xxxx}
が、フラグも'u'
存在する必要があります。正規表現にはフラグがあることに注意してください'gu'
。
「ポジティブ」アサーションは削除する文字を表し、「ネガティブ」アサーションは削除しない文字を表すという意味で、これを「ポジティブ削除アサーション」と呼びました。多くの場合、前の回答で述べたように、否定的な主張は読者にとってより示唆に富むかもしれません。曲折アクセント記号「^
」は「not」と\x00-\x7F
言い、範囲は「ascii」と言うので、2つは一緒に「notascii」と言います。
textContent = textContent.replace(/[^\x00-\x7F]/g,"");
これは、英語だけを気にする英語を話す人にとっては素晴らしい解決策であり、元の質問に対する優れた答えでもあります。しかし、より一般的な文脈では、「すべての非アスキーは悪い」と仮定するという文化的偏見を常に受け入れることはできません。非ASCIIが使用されているが、場合によっては削除する必要があるコンテキストでは、Unicodeの肯定的なアサーションの方が適しています。
幅がゼロの非印刷文字が文字列に埋め込まれていることを示す良い兆候は、文字列の「長さ」プロパティが正(ゼロ以外)であるが、空の文字列のように見える(つまり、印刷される)場合です。たとえば、「textContent」という名前の変数について、これをChromeデバッガーに表示しました。
> 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よりもコンパクトではありません。それはここで説明されています:
textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");
IE(少なくともIE 11)では機能しません。これは、エラーで失敗します。SCRIPT5021を:文字セットに無効な範囲
次の正規表現を使用して、非ASCII文字を置き換えることができます
str = str.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '')
ただし、スペース、コロン、コンマはすべて有効なASCIIであるため、結果は次のようになります。
> str
"INFO] :, , , (Higashikurume)"
[]
任意の文字を意味しますが、[^]
その逆を意味します-括弧内にない任意の文字と一致します。
これらの回答はいずれも、タブ、改行、キャリッジリターンを適切に処理せず、拡張ASCIIとユニコードを処理しないものもあります。これにより、タブと改行は保持されますが、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, ''))
アクセント付きのASCIIを使用するには:
var str = str.replace(/[^\x00-\xFF]/g, "");