var str="INFO] :谷���新道, ひば���ヶ丘2丁���, ひばりヶ���, 東久留米市 (Higashikurume)";
그리고 문자열에서 ASCII가 아닌 모든 문자를 제거해야합니다.
str은 "INFO] (Higashikurume)"만 포함 함을 의미합니다.
답변:
다음과 같이 긍정적 인 제거 주장으로 수행 할 수도 있습니다.
textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");
이것은 유니 코드를 사용합니다. Javascript에서 정규식에 대한 유니 코드를 표현할 때 문자는 이스케이프 시퀀스로 지정 \u{xxxx}
되지만 플래그도 'u'
있어야합니다. 정규식에는 플래그가 'gu'
있습니다.
"긍정적"단언은 제거 할 문자를 표현하는 반면 "부정적"단언은 제거하지 않을 문자를 표현한다는 점에서 이것을 "제거의 긍정적 단언"이라고했습니다. 많은 맥락에서 이전 답변에서 언급했듯이 부정적인 주장은 독자에게 더 암시적일 수 있습니다. 곡절 악센트 " ^
"는 "아님"을 나타내고 범위 \x00-\x7F
는 "ascii"를 나타내므로 두 개가 함께 "아스키가 아님" 이라고 말합니다.
textContent = textContent.replace(/[^\x00-\x7F]/g,"");
이는 영어에만 관심이있는 영어 사용자에게 훌륭한 솔루션이며 원래 질문에 대한 훌륭한 답변이기도합니다. 그러나 좀 더 일반적인 맥락에서 "모든 비 ASCII가 나쁘다"고 가정하는 문화적 편견을 항상 받아 들일 수는 없습니다. 비 ASCII가 사용되지만 때로는 제거해야하는 컨텍스트의 경우 유니 코드의 긍정적 인 주장이 더 적합합니다.
너비가 0이고 인쇄되지 않는 문자가 문자열에 포함되어 있다는 좋은 표시는 문자열의 "length"속성이 양수 (0이 아님)이지만 빈 문자열처럼 보이는 (즉, 다음과 같이 인쇄 됨) 경우입니다. 예를 들어, "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"
이 바이트 시퀀스는 워드 프로세서에 의해 문서에 삽입 된 다음 데이터 필드로 이동하는 일부 유니 코드 문자의 계열에있는 것 같습니다. 가장 일반적으로 이러한 기호는 문서 끝에 나타납니다. 너비가 0 인 공간 "%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 바이트 유니 코드를 사용해야합니다. 실제로 UTF-8은 최대 4 바이트까지 가능합니다. 표준 ASCII 인코딩을 이스케이프하기 위해 상위 비트 (또는 비트)를 사용하기 때문에 유니 코드보다 덜 간결합니다. 여기에 설명되어 있습니다.
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 집합의 모든 것을 제거합니다. 테스트하려면 "이 코드 조각 실행"단추를 클릭하십시오. 새로운 자바 스크립트가 곧 출시 될 예정이므로 향후 (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, "");