var str="INFO] :谷���新道, ひば���ヶ丘2丁���, ひばりヶ���, 東久留米市 (Higashikurume)";
และฉันต้องการลบอักขระที่ไม่ใช่ ascii ทั้งหมดออกจากสตริง
หมายถึง str มีเฉพาะ "INFO] (Higashikurume)";
var str="INFO] :谷���新道, ひば���ヶ丘2丁���, ひばりヶ���, 東久留米市 (Higashikurume)";
และฉันต้องการลบอักขระที่ไม่ใช่ ascii ทั้งหมดออกจากสตริง
หมายถึง str มีเฉพาะ "INFO] (Higashikurume)";
คำตอบ:
ASCII อยู่ในช่วง 0 ถึง 127 ดังนั้น:
str.replace(/[^\x00-\x7F]/g, "");
นอกจากนี้ยังสามารถทำได้ด้วยการยืนยันการลบในเชิงบวกเช่นนี้:
textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");
สิ่งนี้ใช้ Unicode ใน Javascript เมื่อแสดง Unicode สำหรับนิพจน์ทั่วไปอักขระจะถูกระบุด้วยลำดับการหลีกเลี่ยง\u{xxxx}
แต่'u'
ต้องมีแฟล็กด้วย โปรดสังเกตว่า regex มีแฟล็'gu'
ก
ฉันเรียกสิ่งนี้ว่า "การยืนยันในเชิงบวกในการลบ" ในแง่ที่การยืนยัน "เชิงบวก" เป็นการแสดงออกถึงอักขระที่จะลบในขณะที่การยืนยัน "เชิงลบ" เป็นการแสดงออกถึงตัวอักษรที่จะไม่ลบออก ในหลาย ๆ บริบทการยืนยันเชิงลบดังที่ระบุไว้ในคำตอบก่อนหน้านี้อาจชี้นำผู้อ่านได้มากกว่า วงกลม " ^
" \x00-\x7F
"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ไว้ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "ไว้" "" "" "" แล้ว "" "" "" "", " และช่วงที่ระบุว่า" ascii "ทั้งสองจึงรวมกันว่า" ไม่ใช่ ascii "
textContent = textContent.replace(/[^\x00-\x7F]/g,"");
นี่เป็นทางออกที่ดีสำหรับผู้พูดภาษาอังกฤษที่สนใจเฉพาะภาษาอังกฤษและยังเป็นคำตอบที่ดีสำหรับคำถามเดิม แต่ในบริบททั่วไปเราไม่สามารถยอมรับอคติทางวัฒนธรรมของการสมมติว่า "ทั้งหมดที่ไม่ใช่ ascii เป็นสิ่งที่ไม่ดี" สำหรับบริบทที่ใช้ non-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 คำแนะนำในนิพจน์ทั่วไปต้องใช้ Unicode สองไบต์ ในความเป็นจริง UTF-8 สามารถมีความยาวได้ถึงสี่ไบต์ มีขนาดกะทัดรัดน้อยกว่า Unicode เนื่องจากใช้บิตสูง (หรือบิต) เพื่อหลีกเลี่ยงการเข้ารหัส ascii มาตรฐาน คำอธิบายที่นี่:
textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");
ไม่ทำงานใน IE (อย่างน้อย IE 11) ล้มเหลวด้วยข้อผิดพลาด: SCRIPT5021 : ช่วงไม่ถูกต้องในชุดอักขระ
คุณสามารถใช้ regex ต่อไปนี้เพื่อแทนที่อักขระที่ไม่ใช่ ASCII
str = str.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '')
อย่างไรก็ตามโปรดทราบว่าช่องว่างเครื่องหมายทวิภาคและเครื่องหมายจุลภาคเป็น ASCII ที่ถูกต้องทั้งหมดดังนั้นผลลัพธ์จะเป็น
> str
"INFO] :, , , (Higashikurume)"
[]
หมายถึงอักขระใด ๆ แต่ใน[^]
ทางกลับกัน - จับคู่อักขระใด ๆ ที่ไม่อยู่ในวงเล็บ
คำตอบเหล่านี้ไม่มีคำตอบใดที่จัดการแท็บบรรทัดใหม่การคืนค่าขนส่งได้อย่างถูกต้องและคำตอบบางคำไม่จัดการ ASCII และ Unicode ที่ขยายออกไป สิ่งนี้จะเก็บแท็บ & ขึ้นบรรทัดใหม่ แต่ลบอักขระควบคุมและอะไรก็ได้ออกจากชุด 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, "");