ลบอักขระที่ไม่ใช่ตัวอักษรและตัวเลขออกจากสตริง


224

ฉันต้องการแปลงสตริงต่อไปนี้เป็นเอาต์พุตที่จัดเตรียมไว้

Input:  "\\test\red\bob\fred\new"
Output: "testredbobfrednew"

ฉันไม่ได้พบวิธีแก้ปัญหาใด ๆ ที่จะจัดการกับตัวอักษรพิเศษเช่น\r, \n, \bฯลฯ

โดยทั่วไปฉันแค่ต้องการกำจัดสิ่งที่ไม่ใช่ตัวอักษรและตัวเลข นี่คือสิ่งที่ฉันได้ลอง ...

Attempt 1: "\\test\red\bob\fred\new".replace(/[_\W]+/g, "");
Output 1:  "testedobredew"

Attempt 2: "\\test\red\bob\fred\new".replace(/['`~!@#$%^&*()_|+-=?;:'",.<>\{\}\[\]\\\/]/gi, "");
Output 2:  "testedobred [newline] ew"

Attempt 3: "\\test\red\bob\fred\new".replace(/[^a-zA-Z0-9]/, "");
Output 3:  "testedobred [newline] ew"

Attempt 4: "\\test\red\bob\fred\new".replace(/[^a-z0-9\s]/gi, '');
Output 4:  "testedobred [newline] ew"

อีกหนึ่งความพยายามในหลายขั้นตอน

function cleanID(id) {
    id = id.toUpperCase();
    id = id.replace( /\t/ , "T");
    id = id.replace( /\n/ , "N");
    id = id.replace( /\r/ , "R");
    id = id.replace( /\b/ , "B");
    id = id.replace( /\f/ , "F");
    return id.replace( /[^a-zA-Z0-9]/ , "");
}

ด้วยผลลัพธ์

Attempt 1: cleanID("\\test\red\bob\fred\new");
Output 1: "BTESTREDOBFREDNEW"

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม

วิธีการทำงาน:

Final Attempt 1: return JSON.stringify("\\test\red\bob\fred\new").replace( /\W/g , '');
Output 1: "testredbobfrednew"

คำถามที่น่าสนใจ \ n ใน \ ใหม่นั้นชัดเจนว่าเกิดอะไรขึ้น ฉันไม่แน่ใจทั้งหมดวิธีการค้นหาและแทนที่ว่าไปค้นหา regex ในตัวอักษรพิเศษ whitespate
Will Buck

1
อินพุตหนีออกมา / พวกมันถูกกำหนดอย่างไร? var Input = "\\test\red\bob\fred\new"สายนี้ไม่มี "สีแดง" ดังนั้นความพยายามครั้งแรกของคุณถูกต้องคุณกำลังทดสอบกับครอก"\\\\test\\red\\bob\\fred\\new"?
Alex K.

/[^\w\s]+/giลองนี้
Bartosz Grzybowski

ฉันเดาว่าคำถามคือแบ็กสแลชในสตริงอินพุตของคุณแสดงถึงอักขระพิเศษหรือไม่ (จากผลลัพธ์ตัวอย่างของคุณฉันคาดเดาไม่ได้)
เดฟ

พยายามเปลี่ยนจากคำพูดสองคำเป็นคำพูดเดียวหรือไม่
OptimusCrime

คำตอบ:


468

การลบตัวอักษรที่ไม่ใช่ตัวอักษรและตัวเลข

ต่อไปนี้เป็น / a regex ที่ถูกต้องในการตัดอักขระที่ไม่ใช่ตัวอักษรและตัวเลขจากสตริงอินพุต:

input.replace(/\W/g, '')

โปรดทราบว่า\Wเทียบเท่า[^0-9a-zA-Z_]- ประกอบด้วยอักขระขีดล่าง หากต้องการลบขีดล่างที่ใช้เช่น:

input.replace(/[^0-9a-z]/gi, '')

อินพุตมีรูปแบบไม่ถูกต้อง

เนื่องจากสตริงทดสอบมีตัวอักษรที่ใช้ Escape ต่างๆซึ่งไม่ใช่ตัวอักษรและตัวเลขจึงจะลบออก

แบ็กสแลชในสตริงจำเป็นต้องมีการหลบหลีกหากต้องใช้ตัวอักษร:

"\\test\\red\\bob\\fred\\new".replace(/\W/g, '')
"testredbobfrednew" // output

การจัดการสตริงที่มีรูปแบบไม่ถูกต้อง

หากคุณไม่สามารถหลีกเลี่ยงสายป้อนข้อมูลได้อย่างถูกต้อง (เพราะเหตุใด) หรือมาจากแหล่งที่ไม่น่าเชื่อถือ / กำหนดค่าผิดพลาดบางประเภทคุณสามารถทำสิ่งนี้:

JSON.stringify("\\test\red\bob\fred\new").replace(/\W/g, '')
"testredbobfrednew" // output

โปรดทราบว่าการเป็นตัวแทน json ของสตริงรวมถึงคำพูด:

JSON.stringify("\\test\red\bob\fred\new")
""\\test\red\bob\fred\new""

แต่พวกเขาจะถูกลบออกโดย regex ทดแทน


10
สิ่งนี้จะไม่ลบขีดล่างออก
kylex

4
@kylex นั่นเป็นเพราะขีดล่างได้รับการพิจารณาให้เป็นส่วนหนึ่งของพวงตัวอักษรและตัวเลขด้วยเหตุผลบางอย่าง
Eugene Kuzmenko

12
"เพราะมันเป็นตัวละครที่ถูกกฎหมายในตัวระบุตัวแปร" . ไม่มี "_" ในคำถามแน่นอนแทนที่\Wด้วย[_\W](ซึ่งใช้ในคำถาม) หรือคล้ายกันจะลบขีดล่าง
AD7six

1
@ AD7six คุณช่วยอธิบายเพิ่มเติมได้ไหมว่าทำไมจึงควรใช้ JSON.stringify () เมื่อสตริงมาจากแหล่งที่ไม่น่าเชื่อถือ มีความกังวลด้านความปลอดภัยใด ๆ ที่จะไม่ทำเช่นนั้น? ขอบคุณ!
jbmusso

1
@guithor ไม่ใช่ว่า "ควร" หรือมีผลกับความปลอดภัยเลย หากได้รับ "สตริงบางตัว" และไม่ว่าด้วยเหตุผลใดก็ตามมันเป็นบอร์กโดยทั่วไป (ไม่ชัดเจนจากคำถามที่ว่าทำไมสตริงที่ได้รับมีรูปแบบไม่ถูกต้อง) - อนุญาตให้ดูสตริงได้ว่า: jsfiddle.net/Z6N7C
AD7six

49

คำตอบปัจจุบันทั้งหมดยังคงมีนิสัยใจคอสิ่งที่ดีที่สุดที่ฉันจะทำได้คือ:

string.replace(/[^A-Za-z0-9]/g, '');

นี่เป็นตัวอย่างที่รวบรวมทุกคีย์ที่ฉันพบบนแป้นพิมพ์:

var string = '123abcABC-_*(!@#$%^&*()_-={}[]:\"<>,.?/~`';
var stripped = string.replace(/[^A-Za-z0-9]/g, '');
console.log(stripped);

ผลลัพธ์: '123abcABC'


1
input.replace(/\W/g, '')ออกจากใน_ในสตริง @Deminetix string.replace(/[^A-Za-z0-9]/g, '');ทำงานได้ถูกต้องดีขึ้นเพราะมันลบตัวอักษรที่ไม่ใช่ตัวอักษรและตัวเลขทั้งหมดออกจาก String
ทิม

1
และยังเปลี่ยนแปลงของคำตอบนี้ไม่จริงตอบคำถามที่ถาม
AD7six

10

ปัญหาไม่ได้อยู่ที่ว่าคุณจะแทนที่ตัวอักษรได้อย่างไรปัญหาอยู่ที่ว่าคุณป้อนสตริงอย่างไร

มันเป็นเพียงเครื่องหมายทับขวาเป็นครั้งแรกในการป้อนข้อมูลที่เป็นตัวอักษรทับขวาคนอื่น ๆ เป็นส่วนหนึ่งของตัวละครที่ควบคุม\r,\b , และ\f\n

เนื่องจากเครื่องหมายแบ็กสแลชเหล่านั้นไม่ใช่อักขระที่แยกจากกัน แต่เป็นส่วนหนึ่งของสัญลักษณ์ที่จะเขียนอักขระควบคุมตัวเดียวจึงไม่สามารถลบแยกต่างหากได้ \nนั่นคือคุณไม่สามารถลบเครื่องหมายแบ็กสแลชออกได้เนื่องจากไม่ใช่อักขระสองตัวแยกกันเป็นวิธีที่คุณเขียนอักขระควบคุมLFหรืออาหารเส้น

หากคุณต้องการเปลี่ยนอินพุตนั้นเป็นเอาต์พุตที่ต้องการคุณจะต้องแทนที่อักขระควบคุมแต่ละตัวด้วยตัวอักษรที่สอดคล้องกันเช่นแทนที่อักขระ \nnที่มีตัวอักษร

การแทนที่ตัวอักษรควบคุมที่คุณจำเป็นต้องใช้ชุดตัวละครเหมือน[\r]เป็น\rมีความหมายพิเศษในนิพจน์ทั่วไป:

var input = "\\test\red\bob\fred\new";

var output = input
    .replace(/[\r]/g, 'r')
    .replace(/[\b]/g, 'b')
    .replace(/[\f]/g, 'f')
    .replace(/[\n]/g, 'n')
    .replace(/\\/g, '');

การสาธิต: http://jsfiddle.net/SAp4W/


ฉันเข้าใจทุกสิ่งที่คุณพูด แต่คำถามยังคงอยู่และยังไม่มีใครแนะนำคำตอบที่ถูกต้องเลย อินพุตสามารถเปลี่ยนแปลงได้ แต่ไม่มีใครแนะนำคำตอบเกี่ยวกับวิธีการเปลี่ยนโปรแกรมใน JS โดยทางโปรแกรม
Bobby Cannon

2
@ BobCannon: ฉันได้เพิ่มรหัสที่จะป้อนข้อมูลที่แน่นอนของคุณและสร้างผลลัพธ์ที่ต้องการ
Guffa

5

คุณสามารถลอง regex นี้:

value.replace(/[\W_-]/g, '');

ตามคำถาม: ฉันแค่ต้องการกำจัดสิ่งที่ไม่ใช่ตัวอักษรและตัวเลข ผลลัพธ์ที่คุณคาดหวังคืออะไร
myrcutio

0

สิ่งนี้จะลบอักขระที่ไม่ใช่ตัวอักษรและตัวเลขทั้งหมดรักษาตัวพิมพ์ใหญ่และรักษาช่องว่างระหว่างคำ

function alpha_numeric_filter (string) {

  const alpha_numeric = Array.from('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' + ' ')

  const json_string = JSON.stringify(string)

  let filterd_string = ''

  for (let i = 0; i < json_string.length; i++) {

    let char = json_string[i]
    let index = alpha_numeric.indexOf(char)
    if (index > -1) {
      filterd_string += alpha_numeric[index]
    }

  }

  return filterd_string

}

const input = "\\test\red\bob\fred\new"
console.log(alpha_numeric_filter(input)) //=> testredbobfrednew

const complex_string = "/_&_This!&!! is!@#$% a%^&*() Sentence+=-[]{} 123:;\|\\]||~`/.,><"
console.log(alpha_numeric_filter(complex_string)) //=> This is a Sentence 123

ที่ไม่ทำงาน (โปรดอ่านคำถาม) - มันยังเป็นวิธีที่ค่อนข้างซับซ้อนในการทำสิ่ง
AD7six

1
@ AD7six ขอบคุณที่ชี้ให้เห็นข้อผิดพลาดของฉัน เมื่อฉันคัดลอกการป้อนข้อมูลลงใน WebStrom มันจะเพิ่มแบ็กสแลชพิเศษ 2 ตัวให้กับแบ็กสแลชที่มีอยู่แต่ละอันโดยอัตโนมัติ ฉันไม่ได้ยินเสียงนี้ input = "\\ test \ red \ bob \ fred \ new" -> copy_paste = "\\ ทดสอบ \ \ แดง \\ bob \\ fred \\ ใหม่"
Flavio

-1

นี่คือตัวอย่างที่คุณสามารถใช้ได้

function removeNonAplhaNumeric(str){
    return str.replace(/[\W_]/g,"");
}

removeNonAplhaNumeric("0_0 (: /-\ :) 0-0");

-3

หากคุณต้องการ\\test\red\bob\fred\newสตริงนี้คุณควรหลีกเลี่ยงแบ็กสแลชทั้งหมด ( \) เมื่อคุณเขียน\\test\\red\\bob\\fred\\newสตริงของคุณมีแบ็กสแลชเดี่ยว คุณสามารถมั่นใจได้ว่าการพิมพ์สตริงของคุณนี้
ดังนั้นหากแบ็กสแลชในสตริงของคุณถูกหลบหนีmyString.replace(/\W/g,'')จะทำงานได้ตามปกติ


1
หากคุณต้องการแนะนำให้ "คุณควรหลีกเลี่ยงแบ็กสแลชทั้งหมด ()" ดังนั้นคุณต้องให้ตัวอย่างเกี่ยวกับวิธีการทำ
Bobby Cannon

คุณมีอะไรเป็นแบ็กสแลชสองเท่า ??? และสิ่งที่ฉันหมายถึงการพูดว่า "เมื่อคุณเขียน \\ test \\ red \\ bob \\ fred \\ ใหม่สตริงของคุณมี backslashes เดียว" ??? นี่ไม่ได้อธิบายหรือ
shift66

อินพุตคือ "\\ test \ red \ bod \ fred \ new" และไม่สามารถเปลี่ยนแปลงได้ ฉันต้องการโซลูชันสำหรับสตริงอินพุตนั้น หากคุณต้องการแสดงให้ฉันเห็นวิธี "excape the backslashes" ให้ยกตัวอย่าง เราไม่สามารถเปลี่ยนอินพุต ดูคำตอบที่ยอมรับได้ โซลูชันอนุญาตให้อินพุตไม่เปลี่ยนแปลง แต่ให้เอาต์พุตที่ต้องการ
Bobby Cannon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.