var str="INFO] :谷���新道, ひば���ヶ丘2丁���, ひばりヶ���, 東久留米市 (Higashikurume)";
i muszę usunąć wszystkie znaki inne niż ASCII z ciągu,
oznacza, że str zawiera tylko „INFO] (Higashikurume)”;
var str="INFO] :谷���新道, ひば���ヶ丘2丁���, ひばりヶ���, 東久留米市 (Higashikurume)";
i muszę usunąć wszystkie znaki inne niż ASCII z ciągu,
oznacza, że str zawiera tylko „INFO] (Higashikurume)”;
ASCII jest w zakresie od 0 do 127, więc:
str.replace(/[^\x00-\x7F]/g, "");
Można to również zrobić z pozytywnym potwierdzeniem usunięcia, na przykład:
textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");
To używa Unicode. W Javascript, podczas wyrażania Unicode w wyrażeniu regularnym, znaki są określane za pomocą sekwencji sterującej,
\u{xxxx}
ale'u'
musi również występować flaga ; zauważ, że wyrażenie regularne ma flagi'gu'
.Nazwałem to „pozytywnym stwierdzeniem usunięcia” w tym sensie, że „pozytywne” stwierdzenie określa, które znaki należy usunąć, podczas gdy „negatywne” stwierdzenie określa, których liter nie należy usuwać. W wielu kontekstach twierdzenie negatywne, jak stwierdzono we wcześniejszych odpowiedziach, może być bardziej sugestywne dla czytelnika. Daszek „
^
” mówi „nie”, a zakres\x00-\x7F
mówi „ascii”, więc oba razem mówią „nie ascii”.textContent = textContent.replace(/[^\x00-\x7F]/g,"");
To świetne rozwiązanie dla osób mówiących po angielsku, którym zależy tylko na języku angielskim, a także dobra odpowiedź na oryginalne pytanie. Ale w bardziej ogólnym kontekście, nie zawsze można zaakceptować kulturowe nastawienie zakładające, że „wszystko, co nie jest ascii, jest złe”. W kontekstach, w których używane jest inne niż ASCII, ale czasami trzeba je usunąć, lepsze jest zapewnienie pozytywnego potwierdzenia Unicode.
Dobrą wskazówką, że znaki niedrukowalne o zerowej szerokości są osadzone w łańcuchu jest sytuacja, gdy właściwość „length” łańcucha jest dodatnia (różna od zera), ale wygląda jak (tj. Drukuje jako) pusty łańcuch. Na przykład pojawił się ten komunikat w debugerze Chrome dla zmiennej o nazwie „textContent”:
> textContent "" > textContent.length 7
To skłoniło mnie do sprawdzenia, co jest w tym ciągu.
> encodeURI(textContent) "%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B"
Wydaje się, że ta sekwencja bajtów należy do rodziny niektórych znaków Unicode, które są wstawiane przez edytory tekstu do dokumentów, a następnie trafiają do pól danych. Najczęściej te symbole pojawiają się na końcu dokumentu. Przestrzeń o zerowej szerokości
"%E2%80%8B"
może zostać wstawiona przez 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
Niektóre odniesienia na ten temat:
http://www.fileformat.info/info/unicode/char/200B/index.htm
https://en.wikipedia.org/wiki/Left-to-right_mark
Należy zauważyć, że chociaż kodowanie osadzonego znaku to UTF-8, kodowanie w wyrażeniu regularnym nie. Chociaż znak jest osadzony w ciągu jako trzy bajty (w moim przypadku) UTF-8, instrukcje w wyrażeniu regularnym muszą używać dwubajtowego kodu Unicode. W rzeczywistości UTF-8 może mieć długość do czterech bajtów; jest mniej zwarty niż Unicode, ponieważ używa wysokiego bitu (lub bitów), aby uciec od standardowego kodowania ascii. To wyjaśniono tutaj:
https://en.wikipedia.org/wiki/UTF-8
źródło
textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");
nie działa w IE (przynajmniej IE 11). Niepowodzenie i błąd: SCRIPT5021 : Nieprawidłowy zakres w zestawie znakówMożesz użyć następującego wyrażenia regularnego, aby zamienić znaki spoza zestawu ASCII
str = str.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '')
Należy jednak pamiętać, że spacje, dwukropki i przecinki są poprawnymi znakami ASCII, więc wynik będzie
> str "INFO] :, , , (Higashikurume)"
źródło
[]
oznaczają dowolny znak, ale[^]
przeciwnie - dopasuj dowolny znak nie w nawiasach.Żadna z tych odpowiedzi nie obsługuje poprawnie tabulatorów, nowych linii, powrotu karetki, a niektóre nie obsługują rozszerzonego ASCII i Unicode. Pozwoli to ZACHOWAĆ tabulatory i znaki nowej linii, ale usunie znaki kontrolne i wszystko spoza zestawu ASCII. Kliknij przycisk „Uruchom ten fragment kodu”, aby przetestować. Pojawia się jakiś nowy javascript, więc w przyszłości (2020+?) Być może będziesz musiał to zrobić,
\u{FFFFF}
ale jeszcze nieconsole.log("line 1\nline2 \n\ttabbed\nF̸̡̢͓̳̜̪̟̳̠̻̖͐̂̍̅̔̂͋͂͐l̸̢̹̣̤̙͚̱͓̖̹̻̣͇͗͂̃̈͝a̸̢̡̬͕͕̰̖͍̮̪̬̍̏̎̕͘ͅv̸̢̛̠̟̄̿i̵̮͌̑ǫ̶̖͓͎̝͈̰̹̫͚͓̠̜̓̈́̇̆̑͜ͅ".replace(/[\x00-\x08\x0E-\x1F\x7F-\uFFFF]/g, ''))
źródło
Aby użyć ASCII z akcentami:
var str = str.replace(/[^\x00-\xFF]/g, "");
źródło