หนีเครื่องหมายคำถามในจาวาสคริปต์ regex


91

นี่เป็นคำถามง่ายๆที่ฉันคิด

ฉันพยายามค้นหาการเกิดขึ้นของสตริงในสตริงอื่นโดยใช้ regex ใน JavaScript ดังนี้:

 var content ="Hi, I like your Apartment. Could we schedule a viewing? My phone number is: ";

 var gent = new RegExp("I like your Apartment. Could we schedule a viewing? My", "g");

 if(content.search(gent) != -1){   
     alert('worked');     
 }          

สิ่งนี้ใช้ไม่ได้เพราะ?ตัวละคร .... ฉันพยายามหนีด้วย\แต่ก็ไม่ได้ผลเช่นกัน มีวิธีอื่นในการใช้?ตัวอักษรแทนอักขระพิเศษหรือไม่?


ส่วนที่แย่ที่สุดเกี่ยวกับเรื่องนี้คือแม้แต่การใช้สตริงแทน regex ก็ทำให้เกิดปัญหาเช่นstr.search("?")นี้ดูเหมือนว่าจะเป็นบั๊กอย่างแน่นอนเพราะนั่นไม่ใช่นิพจน์ทั่วไปและไม่ควรได้รับการปฏิบัติเหมือน 🤦
Synetech

คำตอบ:


151

คุณต้องหลบหนีโดยใช้แบ็กสแลชสองตัว

\\?

ดูรายละเอียดเพิ่มเติมได้ที่นี่:

http://www.trans4mind.com/personal_development/JavaScript/Regular%20Expressions%20Simple%20Usage.htm


17
…หนึ่งสำหรับ regex และอีกอันสำหรับการปฏิเสธสตริง
Gumbo

ระเบิดใจ! หลังจากทำงานกับ regex มาหลายปีฉันคิดว่าฉันเห็นทุกอย่างแล้ว .. แต่เปล่าไปเลย หนีสองครั้ง เดาว่าวันหนึ่งฉันจะเห็นสาม
Geo

26

คุณควรใช้เครื่องหมายทับคู่:

var regex = new RegExp("\\?", "g");

ทำไม? เนื่องจากใน JavaScript \ยังใช้เพื่อหลีกเลี่ยงอักขระในสตริงดังนั้น: "\?" กลายเป็น:"?"

และ"\\?"กลายเป็น "\?"


16

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

var gent = /I like your Apartment. Could we schedule a viewing\?/g;

6

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

var re = /I like your Apartment\. Could we schedule a viewing\?/g;
                               ^^                            ^^

เมื่อใดก็ตามที่คุณต้องการสร้าง RegExp แบบไดนามิกให้ใช้RegExpสัญกรณ์ตัวสร้างโดยที่คุณต้องใช้แบ็กสแลชสองครั้งเพื่อแสดงเครื่องหมายแบ็กสแลชตามตัวอักษร :

var questionmark_block = "\\?"; // A literal ?
var initial_subpattern = "I like your Apartment\\. Could we schedule a viewing"; // Note the dot must also be escaped to match a literal dot
var re = new RegExp(initial_subpattern + questionmark_block, "g");

และถ้าคุณใช้String.rawสตริงลิเทอรัลคุณอาจใช้\ตามที่เป็นอยู่ (ดูตัวอย่างการใช้ลิเทอรัลสตริงเทมเพลตที่คุณสามารถใส่ตัวแปรลงในรูปแบบ regex):

const questionmark_block = String.raw`\?`; // A literal ?
const initial_subpattern = "I like your Apartment\\. Could we schedule a viewing";
const re = new RegExp(`${initial_subpattern}${questionmark_block}`, 'g'); // Building pattern from two variables
console.log(re); // => /I like your Apartment\. Could we schedule a viewing\?/g

ต้องอ่าน: RegExp: คำอธิบายที่ MDN

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