рятувальний знак питання у регулярному виразі javascript


90

Я думаю, це просте запитання.

Я намагаюся знайти входження рядка в інший рядок, використовуючи регулярний вираз у 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');     
 }          

Це не працює через ?персонажа .... Я намагався врятуватися \, але це теж не працює. Чи є інший спосіб використовувати ?буквально, а не як спеціальний символ?


Найгірше в цьому полягає в тому, що навіть використання рядка замість регулярного виразу спричиняє цю проблему, напр. str.search("?")Це, безумовно, здається помилкою, оскільки це не регулярний вираз, і його не слід розглядати як один. 🤦
Synetech

Відповіді:


150

Вам потрібно уникнути цього двома зворотними скісними рисками

\\?

Докладніше див. Це:

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


17
... один для регулярного виразу і один для деколювання рядків.
Гамбо

Розумний удар! Після багатьох років роботи з регулярними виразами, я подумав, що я все бачив .. Але ні, ось вам. Подвійна втеча. Думаю, одного дня я побачу потрійний.
Geo

26

Ви повинні використовувати подвійну косу риску:

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

Чому? тому що в JavaScript \також використовується, щоб уникати символів у рядках, тому: "\?" стає:"?"

І "\\?", стає "\?"


16

Ви можете розділити свій регулярний вираз косими рисками замість лапок, а потім однією зворотною рискою рискою, щоб уникнути знака питання. Спробуйте це:

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

6

Всякий раз, коли у вас є відомий шаблон (тобто ви не використовуєте змінну для побудови RegExp), використовуйте буквальну нотацію регулярних виразів, де вам потрібно використовувати лише одинарні зворотні скісні риски, щоб уникнути спеціальних метасимволів регулярних виразів:

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рядковий літерал, ви можете використовувати його \як є (див. Приклад використання шаблонного рядкового літералу, де ви можете вставити змінні в шаблон регулярного виразу):

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.