ฉันต้องการลบ""
สตริงรอบ ๆ
เช่นถ้าสตริงคือแล้วฉันต้องการที่จะส่งออกเท่านั้น"I am here"
I am here
str = str.replace(/"/g,"");
str = str.replace(/^"|"$/g, '');
แทนที่คำพูดขอบเขต คำตอบของ Mr_Green จะแทนที่ทั้งหมด"
ซึ่งไม่ดีเลย
ฉันต้องการลบ""
สตริงรอบ ๆ
เช่นถ้าสตริงคือแล้วฉันต้องการที่จะส่งออกเท่านั้น"I am here"
I am here
str = str.replace(/"/g,"");
str = str.replace(/^"|"$/g, '');
แทนที่คำพูดขอบเขต คำตอบของ Mr_Green จะแทนที่ทั้งหมด"
ซึ่งไม่ดีเลย
คำตอบ:
สมมติว่า:
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
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)
หากรับประกันว่าสตริงจะมีเครื่องหมายคำพูดหนึ่งตัว (หรืออักขระอื่นใดก็ได้) ที่จุดเริ่มต้นและจุดสิ้นสุดที่คุณต้องการลบ:
str = str.slice(1, -1);
slice
มีค่าใช้จ่ายน้อยกว่านิพจน์ทั่วไปมาก
<uri>
และตัวอักษรเหมือน"literal"
) ดังนั้นนี่คือ upvote ;)
หากคุณสามารถควบคุมข้อมูลของคุณและคุณรู้ว่าอัญประกาศคู่ของคุณล้อมรอบสตริง (ดังนั้นจะไม่ปรากฏในสตริง) และสตริงเป็นจำนวนเต็ม ... พูดด้วย:
"20151212211647278"
หรือคล้ายกันนี้เอาคำพูดโดยรอบ
JSON.parse("20151212211647278");
ไม่ใช่คำตอบสากล แต่ลื่นสำหรับความต้องการเฉพาะ
JSON.parse("20151212211647278dfvs");
SyntaxError: Unexpected token d in JSON at position 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"
วิธีการนี้จะไม่ได้สัมผัสสตริงถ้ามันไม่ได้มีลักษณะเหมือน
a.charAt(x)
ถ้าคุณต้องการการสนับสนุน <ECMA5 (f.ex IE7)
เมื่อต้องการแก้ไขปัญหาของคุณในแบบที่แสดงเป็นนิพจน์ปกติได้ง่ายขึ้น:
รับสตริงย่อยของตัวละครที่มีอยู่ระหว่างศูนย์หรือหนึ่งคู่อัญประกาศชั้นนำและศูนย์หรือหนึ่งหรือสองคำพูดต่อท้าย
นี่คือ regexp ที่ทำเช่นนั้น:
var regexp = /^"?(.+?)"?$/;
var newStr = str.replace(/^"?(.+?)"?$/,'$1');
ทำลาย regexp:
^"?
การแข่งขันโลภสำหรับศูนย์หรือหนึ่งคำพูดที่นำสอง"?$
การแข่งขันโลภสำหรับศูนย์หรือหนึ่งคำพูดต่อท้ายคู่(.+?)
$1
สิ่งนี้จะส่งคืนdelimited "string" here
สำหรับ:
str = "delimited "string" here" // ...
str = '"delimited "string" here"' // ...
str = 'delimited "string" here"' // ... and
str = '"delimited "string" here'
มันใช้งานได้ ...
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"
var expressionWithoutQuotes = '';
for(var i =0; i<length;i++){
if(expressionDiv.charAt(i) != '"'){
expressionWithoutQuotes += expressionDiv.charAt(i);
}
}
สิ่งนี้อาจใช้ได้ผลสำหรับคุณ
หากคุณต้องการลบอัญประกาศคู่ทั้งหมดในสตริงให้ใช้
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
รหัสง่าย ๆ นี้ยังสามารถใช้งานได้เช่นกันเมื่อต้องการลบเครื่องหมายคำพูดคู่จากสตริงที่ล้อมรอบด้วยเครื่องหมายคำพูดคู่:
var str = 'remove "foo" delimiting double quotes';
console.log(str.replace(/"(.+)"/g, '$1'));
หากคุณพยายามที่จะลบเครื่องหมายคำพูดคู่ลองต่อไปนี้
var Stringstr = "\"I am here\"";
var mystring = String(Stringstr);
mystring = mystring.substring(1, mystring.length - 1);
alert(mystring);
รหัสนี้ดีมากสำหรับหมายเลขแสดงในกล่องข้อความ
$ (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"
โปรดลองติดตาม regex เพื่อลบเครื่องหมายคำพูดคู่ออกจากสตริง
$string = "I am here";
$string =~ tr/"//d;
print $string;
exit();