thoát dấu chấm hỏi trong regex javascript


90

Tôi nghĩ đây là một câu hỏi đơn giản.

Tôi đang cố gắng tìm kiếm sự xuất hiện của một chuỗi trong một chuỗi khác bằng cách sử dụng regex trong JavaScript như sau:

 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');     
 }          

Điều này không hiệu quả vì ?nhân vật .... Tôi đã thử thoát nó bằng \, nhưng điều đó cũng không hiệu quả. Có cách nào khác để sử dụng theo ?nghĩa đen thay vì như một ký tự đặc biệt không?


Phần tồi tệ nhất của điều này là ngay cả việc sử dụng một chuỗi thay vì regex cũng gây ra vấn đề này, ví dụ: str.search("?")Đó chắc chắn có vẻ như là một lỗi vì đó không phải là regex và không nên được coi là một. 🤦
Synetech

Câu trả lời:


150

Bạn cần phải thoát khỏi nó bằng hai dấu gạch chéo ngược

\\?

Xem cái này để biết thêm chi tiết:

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


17
… Một cho regex và một cho khai báo chuỗi.
Gumbo

Tâm trí! Sau nhiều năm làm việc với regex, tôi nghĩ rằng tôi đã nhìn thấy tất cả mọi thứ .. Nhưng không, bạn xem đây. Thoát kép. Đoán một ngày nào đó tôi sẽ tăng gấp ba lần.
Geo

26

Bạn nên sử dụng dấu gạch chéo kép:

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

Tại sao? bởi vì trong JavaScript, hàm \cũng được sử dụng để thoát các ký tự trong chuỗi, vì vậy: "\?" trở thành:"?"

"\\?", trở thành "\?"


16

Bạn có thể phân tách regexp của mình bằng dấu gạch chéo thay vì dấu ngoặc kép và sau đó là dấu gạch chéo ngược để thoát khỏi dấu chấm hỏi. Thử đi:

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

6

Bất cứ khi nào bạn có một mẫu đã biết (tức là bạn không sử dụng một biến để xây dựng RegExp), hãy sử dụng ký hiệu regex theo nghĩa đen , nơi bạn chỉ cần sử dụng dấu gạch chéo ngược duy nhất để thoát khỏi các siêu ký tự regex đặc biệt:

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

Bất cứ khi nào bạn cần tạo một RegExp động, hãy sử dụng RegExpký hiệu phương thức khởi tạo , nơi bạn PHẢI kép dấu gạch chéo ngược cho chúng để biểu thị dấu gạch chéo ngược theo nghĩa đen :

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");

Và nếu bạn sử dụng String.rawchuỗi ký tự, bạn có thể sử dụng \như vậy (xem ví dụ về việc sử dụng chuỗi mẫu theo nghĩa đen nơi bạn có thể đặt các biến vào mẫu 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

A phải đọc: RegExp: Mô tả tại MDN.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.