ฉันต้องการลบเครื่องหมายคำพูดคู่จากสตริง


239

ฉันต้องการลบ""สตริงรอบ ๆ

เช่นถ้าสตริงคือแล้วฉันต้องการที่จะส่งออกเท่านั้น"I am here"I am here


4
ทำไมคุณไม่ใช้ string.replace ('' ',' ')
Adarsh ​​Kumar

69
str = str.replace(/"/g,"");
Mr_Green

11
คุณต้องการที่จะลบคำพูดทั้งหมดหรือคำพูดขอบเขต?
คอส

36
stackoverflow.com/q/19155566/989121 คุณจะถามคำถาม 255 ข้อสำหรับอักขระ ASCII แต่ละตัวหรือไม่
georg

6
str = str.replace(/^"|"$/g, '');แทนที่คำพูดขอบเขต คำตอบของ Mr_Green จะแทนที่ทั้งหมด"ซึ่งไม่ดีเลย
Kolob Canyon

คำตอบ:


387

สมมติว่า:

var someStr = 'He said "Hello, my name is Foo"';
console.log(someStr.replace(/['"]+/g, ''));

ที่ควรทำเคล็ดลับ ... (ถ้าเป้าหมายของคุณคือการแทนที่คำพูดสองคำทั้งหมด )

นี่คือวิธีการทำงาน:

  • ['"]เป็นคลาสตัวละครจับคู่ทั้งคำพูดเดี่ยวและคู่ คุณสามารถแทนที่สิ่งนี้ด้วย"เพื่อจับคู่คำพูดคู่เท่านั้น
  • +: เครื่องหมายคำพูดหนึ่งตัวหรือมากกว่าตัวอักษรตามที่กำหนดโดย char-class ก่อนหน้า (ตัวเลือก)
  • g: ธงระดับโลก สิ่งนี้บอกให้ JS ใช้ regex กับสตริงทั้งหมด หากคุณข้ามสิ่งนี้ไปคุณจะแทนที่อักขระตัวเดียว

หากคุณพยายามที่จะลบเครื่องหมายคำพูดรอบสตริงที่กำหนด (เช่นเป็นคู่) สิ่งต่าง ๆ จะมีเล่ห์เหลี่ยมมากกว่า คุณจะต้องใช้การยืนยันแบบ lookaround:

var str = 'remove "foo" delimiting double quotes';
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove foo delimiting quotes
str = 'remove only "foo" delimiting "';//note trailing " at the end
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove only foo delimiting "<-- trailing double quote is not removed

Regex อธิบายว่า:

  • ": ตัวอักษรตรงกับตัวอักษรใด ๆ "
  • (: เริ่มจับภาพกลุ่ม อะไรก็ตามที่อยู่ระหว่างวงเล็บ ( ()) จะถูกจับและสามารถใช้ในค่าทดแทน
  • [^"]+: คลาสตัวละครจับคู่ตัวอักษรทั้งหมดยกเว้น"1 ครั้งขึ้นไป
  • (?="): zero-width (ไม่ได้อยู่ในการจับ) การยืนยันเชิงบวก lookahead การแข่งขันก่อนหน้านี้จะมีผลก็ต่อเมื่อมันตามด้วย"ตัวอักษร
  • ): สิ้นสุดการจับภาพกลุ่มเราได้รวบรวมทุกอย่างไว้ในระหว่างการเปิดปิด "
  • ": อีกหนึ่งรายการ cf ที่แท้จริงรายการหนึ่ง

การแทนที่คือ'$1'นี่เป็นการอ้างอิงย้อนกลับไปยังกลุ่มที่ถูกจับเป็นครั้งแรก[^" ]+หรือทุกครั้งที่อยู่ระหว่างเครื่องหมายคำพูดคู่ รูปแบบนั้นตรงกับทั้งเครื่องหมายคำพูดและสิ่งที่อยู่ในเครื่องหมายคำพูด แต่จะแทนที่ด้วยเครื่องหมายคำพูดและสิ่งที่อยู่ระหว่างเครื่องหมายคำพูดเท่านั้นดังนั้นจึงเป็นการลบอย่างมีประสิทธิภาพ
อะไรที่มันไม่เป็นsome "string with" quotes-> แทนที่"string with"ด้วย string with-> คำคมหายไปงานเสร็จแล้ว

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

str.replace(/^"(.+(?="$))"$/, '$1');

ด้วยอินพุตremove "foo" delimiting "เอาต์พุตจะยังคงไม่เปลี่ยนแปลง แต่เปลี่ยนสตริงอินพุตเป็น"remove "foo" delimiting quotes"และคุณจะลงท้ายด้วยremove "foo" delimiting quotesเอาต์พุต

คำอธิบาย:

  • ^": ตรงกับจุดเริ่มต้นของสตริงและ^ "หากสตริงไม่ได้เริ่มต้นด้วย a "นิพจน์จะล้มเหลวที่นี่และไม่มีอะไรถูกแทนที่
  • (.+(?="$)): จับคู่ (และจับ) ทุกอย่างรวมถึงเครื่องหมายคำพูดสองครั้งหนึ่งครั้งขึ้นไปหากมีการมองเชิงบวกจะเป็นจริง
  • (?="$): lookahead เชิงบวกมีค่าเท่ากันกับด้านบนมีเพียงระบุว่า" ต้องเป็นจุดสิ้นสุดของสตริง ( $=== end)
  • "$: ตรงกับเครื่องหมายคำพูดที่สิ้นสุด แต่ไม่จับภาพ

การแทนที่จะทำในลักษณะเดียวกับก่อนหน้านี้: เราแทนที่การแข่งขัน (ซึ่งรวมถึงการเปิดและปิดราคา) ด้วยทุกอย่างที่อยู่ภายใน
คุณอาจสังเกตเห็นว่าฉันไม่ได้gตั้งค่าสถานะ (สำหรับ BTW ทั่วโลก) เนื่องจากเรากำลังประมวลผลสตริงทั้งหมดนิพจน์นี้จะใช้เพียงครั้งเดียว
regex ที่ง่ายกว่านั้นก็เหมือนกัน (มีความแตกต่างภายในของวิธีการรวบรวม / นำไปใช้กับ regex):

someStr.replace(/^"(.+)"$/,'$1');

เหมือนก่อน^"และ"$จับคู่เครื่องหมายคำพูดคั่นที่จุดเริ่มต้นและจุดสิ้นสุดของสตริงและ(.+)จับคู่ทุกอย่างในระหว่างและจับมัน ฉันลอง regex นี้ควบคู่ไปกับข้างบน (ด้วยการยืนยันแบบ lookahead) และเป็นที่ยอมรับต่อความประหลาดใจของฉันที่พบว่าอันนี้ช้ากว่าเล็กน้อย ฉันเดาว่าการยืนยันแบบ lookaround ทำให้นิพจน์ก่อนหน้านั้นล้มเหลวทันทีที่เอ็นจิ้นพิจารณาว่าไม่มี"ที่ส่วนท้ายของสตริง อ่า แต่ถ้านี่คือสิ่งที่คุณต้องการ / ต้องการโปรดอ่านต่อไป :

อย่างไรก็ตามในกรณีนี้มันปลอดภัยกว่าเร็วกว่าดูแลรักษาได้มากกว่าและทำได้ดีกว่า:

if (str.charAt(0) === '"' && str.charAt(str.length -1) === '"')
{
    console.log(str.substr(1,str.length -2));
}

ที่นี่ฉันกำลังตรวจสอบว่าอักขระตัวแรกและตัวสุดท้ายในสตริงเป็นเครื่องหมายคำพูดคู่หรือไม่ หากเป็นเช่นนั้นฉันใช้substrเพื่อตัดตัวอักษรแรกและตัวสุดท้าย charAt(str.length -1)สตริงจะเป็นศูนย์การจัดทำดัชนีเพื่อให้ถ่านสุดท้ายคือ substrต้องการอาร์กิวเมนต์ 2 ตัวโดยที่ตัวแรกคืออ็อฟเซ็ตที่ซับสตริงเริ่มทำงานตัวที่สองคือความยาว str.length - 2เนื่องจากเราไม่ต้องการถ่านที่ผ่านมาอีกต่อไปกว่าที่เราต้องการเป็นครั้งแรกที่มีความยาว Easy-peazy

เคล็ดลับ :

ข้อมูลเพิ่มเติมเกี่ยวกับการมองหาการยืนยันสามารถพบได้ที่นี่
Regex มีประโยชน์มาก (และ IMO สนุก) สามารถทำให้งุนงงเล็กน้อยในตอนแรก นี่คือรายละเอียดเพิ่มเติมและลิงก์ไปยังแหล่งข้อมูลเกี่ยวกับเรื่องนี้
หากคุณยังไม่สะดวกที่จะใช้ regex คุณอาจต้องพิจารณาใช้:

var noQuotes = someStr.split('"').join('');

หากมีคำพูดมากมายในสตริงสิ่งนี้อาจเร็วกว่าการใช้ regex


1
@ ทาง: ฉันแก้ไข expainding เล็กน้อยในสิ่งที่การแสดงออกและวิธีการปรับแต่ง
Elias Van Ootegem

83
str = str.replace(/^"(.*)"$/, '$1');

regexp นี้จะลบเครื่องหมายคำพูดหากพวกเขาเป็นตัวอักษรตัวแรกและตัวสุดท้ายของสตริง F.ex:

"I am here"  => I am here (replaced)
I "am" here  => I "am" here (untouched)
I am here"   => I am here" (untouched)

63

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

str = str.slice(1, -1);

slice มีค่าใช้จ่ายน้อยกว่านิพจน์ทั่วไปมาก


8
ทำไมต้องโหวต '' ฉันอยู่ที่นี่ ''. ชิ้น (1, -1) -> 'ฉันอยู่ที่นี่'!
darrinm

2
ประหลาดใจที่สิ่งนี้ได้รับการลดลงเนื่องจากเป็นประเภทของการดำเนินการ 'ด่วน' ที่คุณต้องการหากคุณกำลังจัดการกับตัวอักษร RDF (ใน N3 ตัวอย่างเช่น URIs มักจะเขียนแทนเช่น<uri>และตัวอักษรเหมือน"literal") ดังนั้นนี่คือ upvote ;)
ทำเครื่องหมาย Birbeck

2
(โดยเฉพาะอย่างยิ่งเพราะคำถามเดิมบอกว่าพวกเขาต้องการลบเครื่องหมายคำพูดรอบสตริง)
Mark Birbeck

2
นี่ควรเป็นคำตอบที่ยอมรับเช่นเดียวกับสิ่งที่ถูกถามและทำอย่างมีประสิทธิภาพ
ปาสกาล

38

หากคุณสามารถควบคุมข้อมูลของคุณและคุณรู้ว่าอัญประกาศคู่ของคุณล้อมรอบสตริง (ดังนั้นจะไม่ปรากฏในสตริง) และสตริงเป็นจำนวนเต็ม ... พูดด้วย:

"20151212211647278"

หรือคล้ายกันนี้เอาคำพูดโดยรอบ

JSON.parse("20151212211647278");

ไม่ใช่คำตอบสากล แต่ลื่นสำหรับความต้องการเฉพาะ


ข้อผิดพลาดนี้จะเกิดกับ FireFox ด้วย: SyntaxError: JSON.parse: อักขระที่ไม่คาดคิดที่บรรทัด 1 คอลัมน์ 1 ของข้อมูล JSON
Ben Pretorius

ไม่ ... ใช้งานได้ดีกับ FireFox
Scott Stensland

JSON.parse ( "{123123}"); สิ่งนี้จะทำให้คำตอบของคุณหยุด
ชะงัก

3
JSON.parse("20151212211647278dfvs"); SyntaxError: Unexpected token d in JSON at position 17
Systems Rebooter

1
ฉันได้รับข้อผิดพลาด SyntaxError: โทเค็นที่ไม่คาดคิด <ใน JSON ที่ตำแหน่ง 0
Freddy Sidauruk

17

หากคุณต้องการลบเครื่องหมายคำพูดในขอบเขต:

function stripquotes(a) {
    if (a.charAt(0) === '"' && a.charAt(a.length-1) === '"') {
        return a.substr(1, a.length-2);
    }
    return a;
}

"text in quotes"วิธีการนี้จะไม่ได้สัมผัสสตริงถ้ามันไม่ได้มีลักษณะเหมือน


2
ใช้a.charAt(x)ถ้าคุณต้องการการสนับสนุน <ECMA5 (f.ex IE7)
David Hellsing

8

หากคุณต้องการลบเครื่องหมายคำพูดจากจุดเริ่มต้นหรือจุดสิ้นสุดให้ใช้นิพจน์ทั่วไปต่อไปนี้:

'"Hello"'.replace(/(^"|"$)/g, '');

1
หมายเหตุนี้จะเป็นการปรับเปลี่ยนและ"foo foo"หนึ่งอาจต้องการวางคู่เหล่านี้ทั้งหมดเท่านั้น
Kos

ขอบคุณสำหรับข้อความฉันคิดว่ามันเป็นพฤติกรรมที่คาดหวัง
เดนิส

5

เมื่อต้องการแก้ไขปัญหาของคุณในแบบที่แสดงเป็นนิพจน์ปกติได้ง่ายขึ้น:

รับสตริงย่อยของตัวละครที่มีอยู่ระหว่างศูนย์หรือหนึ่งคู่อัญประกาศชั้นนำและศูนย์หรือหนึ่งหรือสองคำพูดต่อท้าย

นี่คือ regexp ที่ทำเช่นนั้น:

  var regexp = /^"?(.+?)"?$/;
  var newStr = str.replace(/^"?(.+?)"?$/,'$1');

ทำลาย regexp:

  • ^"? การแข่งขันโลภสำหรับศูนย์หรือหนึ่งคำพูดที่นำสอง
  • "?$ การแข่งขันโลภสำหรับศูนย์หรือหนึ่งคำพูดต่อท้ายคู่
  • ทั้งสอง bookend จับไม่โลภของตัวละครอื่น ๆ ทั้งหมดซึ่งจะมีเป้าหมายเป็น(.+?)$1

สิ่งนี้จะส่งคืนdelimited "string" hereสำหรับ:

str = "delimited "string" here"  // ...
str = '"delimited "string" here"' // ...
str = 'delimited "string" here"' // ... and
str = '"delimited "string" here'

5

ซับสำหรับคนขี้เกียจ

var str = '"a string"';
str = str.replace(/^"|"$/g, '');

นี่คือคำตอบที่เหมาะสมที่สุด จะไม่ทำงาน/"/g "My name is \"Jason\""
Jason Liu

คำตอบนี้จะลบคำพูดทุกคำในจุดเริ่มต้นและจุดสิ้นสุดซึ่งไม่ดีในกรณีของ" - is a quoteสตริงดังนั้นจึงไม่เหมือนกับรอบ
vladkras

2

มันใช้งานได้ ...

var string1 = "'foo'";
var string2 = '"bar"';

function removeFirstAndLastQuotes(str){
  var firstChar = str.charAt(0);
  var lastChar = str[str.length -1];
  //double quotes
  if(firstChar && lastChar === String.fromCharCode(34)){
    str = str.slice(1, -1);
  }
  //single quotes
  if(firstChar && lastChar === String.fromCharCode(39)){
    str = str.slice(1, -1);
  }
  return str;
}
console.log(removeFirstAndLastQuotes(string1));
console.log(removeFirstAndLastQuotes(string2));


รหัสผิด ลองใส่สตริงที่ว่างเปล่าหรือลอง'foo"หรือเพียงfoo"
Pavel P

1
var expressionWithoutQuotes = '';
for(var i =0; i<length;i++){
    if(expressionDiv.charAt(i) != '"'){
        expressionWithoutQuotes += expressionDiv.charAt(i);
    }
}

สิ่งนี้อาจใช้ได้ผลสำหรับคุณ


0

หากคุณต้องการลบอัญประกาศคู่ทั้งหมดในสตริงให้ใช้

var str = '"some "quoted" string"';
console.log( str.replace(/"/g, '') );
// some quoted string

มิฉะนั้นคุณต้องการลบเฉพาะเครื่องหมายคำพูดรอบสตริงใช้:

var str = '"some "quoted" string"';
console.log( clean = str.replace(/^"|"$/g, '') );
// some "quoted" string

0

รหัสง่าย ๆ นี้ยังสามารถใช้งานได้เช่นกันเมื่อต้องการลบเครื่องหมายคำพูดคู่จากสตริงที่ล้อมรอบด้วยเครื่องหมายคำพูดคู่:

var str = 'remove "foo" delimiting double quotes';
console.log(str.replace(/"(.+)"/g, '$1'));

0

หากคุณพยายามที่จะลบเครื่องหมายคำพูดคู่ลองต่อไปนี้

  var Stringstr = "\"I am here\"";
  var mystring = String(Stringstr);
  mystring = mystring.substring(1, mystring.length - 1);
  alert(mystring);

0

รหัสนี้ดีมากสำหรับหมายเลขแสดงในกล่องข้อความ

$ (this) = [กล่องข้อความของคุณ]

            var number = $(this).val();
            number = number.replace(/[',]+/g, '');
            number = number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
            $(this).val(number); // "1,234,567,890"

-2

โปรดลองติดตาม regex เพื่อลบเครื่องหมายคำพูดคู่ออกจากสตริง

    $string = "I am here";
    $string =~ tr/"//d;
    print $string;
    exit();

2
พวกเขาต้องการโซลูชัน javascript!
โตโต้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.