ลบอักขระพิเศษทั้งหมดด้วย RegExp


234

ฉันต้องการ RegExp ที่จะลบอักขระพิเศษทั้งหมดออกจากสตริง ฉันกำลังลองสิ่งนี้ แต่มันไม่ทำงานใน IE7 ถึงแม้ว่ามันจะใช้งานได้ใน Firefox

var specialChars = "!@#$^&%*()+=-[]\/{}|:<>?,.";

for (var i = 0; i < specialChars.length; i++) {
  stringToReplace = stringToReplace.replace(new RegExp("\\" + specialChars[i], "gi"), "");
}

คำอธิบายโดยละเอียดของ RegExp ก็มีประโยชน์เช่นกัน


18
สิ่งนี้จะดีกว่าในรายการขาวไม่ใช่บัญชีดำ จากนั้นคุณสามารถทำ [az] | [0-9] | \ s
Ape-inago

ข้อผิดพลาดสคริปต์ใด ๆ คุณตรวจแก้จุดบกพร่องหรือไม่ หรือมิฉะนั้นลอง ... catch block ในโค้ดจาวาสคริปต์
Kangkan

@ Ape-inago คุณช่วยอธิบาย RegExp ให้ฉันหน่อยได้ไหม
Timothy Ruhle

3
กรุณาระบุ "ตัวละครพิเศษ"! "風" พิเศษสำหรับคุณหรือเปล่า? (เมื่อคิดถึงเรื่องนี้คุณจะเห็นประเด็นของ @ Ape-iango)
หลอกลวง

7
ฉันไม่คิดว่าใครที่นี่หมายถึงความผิดใด ๆ ฉันเคยถูกไฟไหม้มาก่อนโดยทำมันเป็นบัญชีดำเพราะมักจะมี "gotcha's" ที่จบลงด้วยการผ่าน (เช่นตัวอย่างของการหลอกลวง) ในที่สุดวิธีการที่ถูกต้องเป็นมากกว่าเกี่ยวกับสาเหตุที่คุณพยายามทำเช่นนี้
Ape-inago

คำตอบ:


612
var desired = stringToReplace.replace(/[^\w\s]/gi, '')

ดังที่ได้กล่าวไว้ในความคิดเห็นการทำสิ่งนี้ในรายการที่อนุญาตทำได้ง่ายกว่า - แทนที่อักขระที่ไม่อยู่ในรายการที่ปลอดภัยของคุณ

อักขระคาเร็ต ( ^) คือการปฏิเสธของชุด[...] , giพูดทั่วโลกและกรณีตาย (หลังเป็นซ้ำซ้อนบิต แต่ผมอยากจะพูดถึงมัน) และ safelist ในตัวอย่างนี้เป็นตัวเลขตัวอักษรคำขีดล่าง ( \w) และช่องว่าง ( \s)


50
วิธีนี้ไม่ทำงานสำหรับสัญลักษณ์ที่ไม่ใช่ภาษาอังกฤษ ตัวอย่างเช่น "Їжак"
Seagull

4
คุณสามารถใช้ตัวพิมพ์ใหญ่ \ W แทน ^ \ w \ W: จับคู่อักขระที่ไม่ใช่คำใด ๆ เทียบเท่ากับ [^ A-Za-z0-9_] developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
delkant

@Seagull ฉันได้เพิ่มคำตอบที่จัดการกับ Unicodes
freedev

1
เพื่อยอมรับคำที่เน้นเสียงเช่นในภาษาโปรตุเกส, ให้ทำสิ่งนี้: stringToReplace.replace (/ [^ A-zÀ-ú \ s] / gi, '')
alansiqueira27

1
ในการเพิ่มภาษายุโรปส่วนใหญ่ (นอร์เวย์, สวีเดน, เยอรมัน, พอร์ตโทจิส, สเปน) stringToReplace.replace (/ [^ \ w \ s \ xc0-xff] / gi, '') ในการรวมช่วงยูนิโคดภาษาอื่น ๆ สามารถใช้ได้ ดู: stackoverflow.com/questions/150033/…
Eskil Mjelva Saatvedt

105

โปรดทราบว่าหากคุณยังต้องการแยกชุดรวมถึงสิ่งต่าง ๆ เช่นเครื่องหมายทับและอักขระพิเศษคุณสามารถทำสิ่งต่อไปนี้:

var outString = sourceString.replace(/[`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, '');

รับทราบเป็นพิเศษว่าในการที่จะรวมตัวละคร "ลบ" คุณจะต้องหลบมันด้วยแบ็กสแลชเหมือนกลุ่มหลัง หากคุณไม่เลือกก็จะเลือก 0-9 ซึ่งอาจไม่เป็นที่ต้องการ


10
ทางออกที่ดีเยี่ยม! คำตอบที่ได้รับการยอมรับนั้นใช้ได้กับภาษาอังกฤษเท่านั้นและใช้ได้กับทุกภาษา (เท่าที่ฉันตรวจสอบ) ขอบคุณ :)
Ronen Ness

1
@ Knutole ลบ?ส่วนชุดอักขระออกทางด้านหน้า นี่คือรายการอักขระที่คุณต้องการลบดังนั้นการแยกอักขระออกจากการถูกปล้นจะรวมอยู่ในผลลัพธ์สุดท้าย
noinput

มันใช้งานได้ดีเหมาะอย่างยิ่งสำหรับภาษาใด ๆ เพียงแค่ต้องเพิ่มตัวอักษรที่คุณต้องการแทนที่และนั่นคือทั้งหมด ขอบคุณ
Elros Romeo

21

Javascript ธรรมดาล้วนไม่จัดการกับตัวอักษร Unicodeไม่ได้จัดการกับตัวอักษร

อย่าใช้[^\w\s]สิ่งนี้จะลบตัวอักษรที่มีเครื่องหมายเน้นเสียง (เช่นàééìòù) ไม่ต้องพูดถึงซิริลลิกหรือจีนตัวอักษรที่มาจากภาษาดังกล่าวจะถูกลบออก

คุณไม่ต้องการลบจดหมายเหล่านี้พร้อมกับอักขระพิเศษทั้งหมด คุณมีสองโอกาส:

  • เพิ่มตัวอักษรพิเศษทั้งหมดที่คุณไม่ต้องการลบใน regex ของคุณ
    ตัวอย่างเช่น[^èéòàùì\w\s]ตัวอย่างเช่น:
  • มีลักษณะที่xregexp.com XRegExp เพิ่มการสนับสนุนพื้นฐานสำหรับการจับคู่ Unicode ผ่านทาง\p{...}ไวยากรณ์

var str = "Їжак::: résd,$%& adùf"
var search = XRegExp('([^?<first>\\pL ]+)');
var res = XRegExp.replace(str, search, '',"all");

console.log(res); // returns "Їжак::: resd,adf"
console.log(str.replace(/[^\w\s]/gi, '') ); // returns " rsd adf"
console.log(str.replace(/[^\wèéòàùì\s]/gi, '') ); // returns " résd adùf"
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.1.1/xregexp-all.js"></script>


3
เป็นการดีสำหรับความเป็นสากลฉันไม่รู้ว่า JS regex ไม่ได้เป็น UTF-8
LessQuesar

คุณไม่สามารถใส่ตัวอักษร UTF-8 ที่ถูกต้องทั้งหมดลงใน var str
Seagull

@Seagull ใช่ แต่ในกรณีที่คุณไม่ได้เขียนแอพพลิเคชั่นที่ใช้งานร่วมกันได้ทั่วโลกคุณสามารถใส่เฉพาะรายการตัวอักษร UTF-8 ที่ถูกต้องสำหรับการแปลปัจจุบันของคุณ ในกรณีของฉันสำหรับภาษาอิตาลีมีเพียงไม่กี่ตัวอักษร
freedev

7

วิธีแก้ปัญหาแรกไม่สามารถใช้ได้กับตัวอักษร UTF-8 ใด ๆ (มันจะตัดข้อความเช่นЇжак) ฉันจัดการเพื่อสร้างฟังก์ชั่นที่ไม่ได้ใช้ RegExp และใช้การสนับสนุน UTF-8 ที่ดีในเอนจิ้น JavaScript ความคิดนั้นง่ายหากสัญลักษณ์มีตัวพิมพ์ใหญ่และตัวพิมพ์เล็กเป็นอักขระพิเศษ มีข้อยกเว้นเพียงอย่างเดียวสำหรับช่องว่าง

function removeSpecials(str) {
    var lower = str.toLowerCase();
    var upper = str.toUpperCase();

    var res = "";
    for(var i=0; i<lower.length; ++i) {
        if(lower[i] != upper[i] || lower[i].trim() === '')
            res += str[i];
    }
    return res;
}

อัปเดต:โปรดทราบว่าโซลูชันนี้ใช้งานได้กับภาษาที่มีอักษรตัวเล็กและใหญ่เท่านั้น ในภาษาจีนเช่นนี้จะไม่ทำงาน

อัปเดต 2:ฉันมาที่โซลูชันดั้งเดิมเมื่อฉันทำงานกับการค้นหาที่คลุมเครือ หากคุณพยายามลบอักขระพิเศษเพื่อใช้ฟังก์ชันการค้นหาก็จะมีวิธีการที่ดีกว่า ใช้ไลบรารีการทับศัพท์ใด ๆที่จะสร้างสตริงคุณจากตัวอักษรละตินเท่านั้นจากนั้น Regexp แบบง่าย ๆ จะทำการลบอักขระพิเศษทั้งหมด (สิ่งนี้จะใช้ได้กับภาษาจีนด้วยและคุณจะได้รับผลประโยชน์ด้านข้างด้วยการทำTromsø== Tromso)


ยอดเยี่ยมเหมือนคำตอบนี้! ฉันใช้มันเพื่อสร้างชื่อไฟล์ที่ถูกต้องและขยายโซลูชันของคุณเพื่อลบช่องว่าง (รองรับ Linux / Unix) และอนุญาตให้ใช้ตัวเลขเช่นกัน ดังนั้นฉันจึงขยายคำสั่ง if (jQuery ที่เกี่ยวข้อง): if (str [i]! == '' && (lower [i]! = upper [i] || ต่ำกว่า [i] .trim () === '' | | $ .isNumeric (str [i])))
Jonny

ในหลายภาษาไม่มีตัวอักษรตัวพิมพ์ใหญ่ ... ดังนั้นฟังก์ชั่นจะพิจารณาอินพุตที่ถูกต้องเป็นตัวอักษรพิเศษ
Yair Levy

ตัวอักษรจีนเป็นตัวอย่างหนึ่งที่ทำให้เกิดปัญหาได้
lethek

เมื่อฉันสร้างโซลูชันนี้โชคไม่ดีที่ฉันไม่ได้คิดถึงภาษาจีน ต้องเสนอวิธีแก้ปัญหาเนื่องจากคำตอบก่อนหน้านี้จะไม่ทำงานเช่นกัน
Seagull

1

ฉันใช้ RegexBuddy สำหรับการดีบัก regexes ของฉันมันมีเกือบทุกภาษาที่เป็นประโยชน์อย่างมาก กว่าคัดลอก / วางสำหรับภาษาเป้าหมาย เครื่องมือที่ยอดเยี่ยมและไม่แพงมาก

ดังนั้นฉันจึงคัดลอก / วาง regex ของคุณและปัญหาของคุณคือ [,] เป็นตัวอักษรพิเศษใน regex ดังนั้นคุณต้องหลบหนีพวกเขา ดังนั้น regex ควรจะเป็น: /!@#$^&%*()+=url=x5B\x5Durrency_/membership:


0

ทำไมคุณไม่ทำสิ่งที่ชอบ:

re = /^[a-z0-9 ]$/i;
var isValid = re.test(yourInput);

เพื่อตรวจสอบว่าการป้อนข้อมูลของคุณมีอักขระพิเศษใด ๆ


17
OP บอกว่าเขากำลังพยายามลบอักขระพิเศษที่ไม่เห็นว่ามีอยู่จริงหรือไม่
annakata

นี่เป็นวิธีแก้ปัญหาที่ดี แต่จะอนุญาตเฉพาะตัวเลขตัวอักษรภาษาอังกฤษและช่องว่างเท่านั้น แต่จะลบอักขระเช่นนี้èéòàùìและบางกรณีนี่อาจไม่ใช่วิธีแก้ปัญหา
mapmalith

0

str.replace(/\s|[0-9_]|\W|[#$%^&*()]/g, "")ฉันทำแบบนี้ แต่มีบางคนที่ทำได้ง่ายกว่ามากstr.replace(/\W_/g,"");


สิ่งต่างๆในแนวทางของคุณซ้ำซ้อนเนื่องจาก\Wมีอักขระบางตัว แต่ทำไมคุณถึงกรองตัวเลข? นั่นไม่ใช่ตัวอักษรพิเศษ
user4642212
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.