Giả định:
var someStr = 'He said "Hello, my name is Foo"';
console.log(someStr.replace(/['"]+/g, ''));
Điều đó sẽ tạo nên mánh khóe ... (nếu mục tiêu của bạn là thay thế tất cả các trích dẫn kép).
Đây là cách nó hoạt động:
['"]
là một lớp nhân vật, phù hợp với cả dấu ngoặc đơn và dấu ngoặc kép. bạn có thể thay thế bằng "
chỉ khớp dấu ngoặc kép.
+
: một hoặc nhiều dấu ngoặc kép, ký tự, như được định nghĩa bởi lớp char trước (tùy chọn)
g
: cờ toàn cầu . Điều này nói với JS để áp dụng regex cho toàn bộ chuỗi. Nếu bạn bỏ qua điều này, bạn sẽ chỉ thay thế một char duy nhất.
Nếu bạn đang cố gắng loại bỏ các trích dẫn xung quanh một chuỗi nhất định (nghĩa là theo cặp), mọi thứ sẽ phức tạp hơn một chút. Bạn sẽ phải sử dụng các xác nhận tìm kiếm:
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 giải thích:
"
: nghĩa đen, phù hợp với bất kỳ nghĩa đen "
(
: bắt đầu chụp nhóm. Bất cứ điều gì là giữa các dấu ngoặc đơn (()
) sẽ được ghi lại và có thể được sử dụng trong giá trị thay thế.
[^"]+
: Lớp nhân vật, phù hợp với tất cả các ký tự, ngoại trừ"
1 hoặc nhiều lần
(?=")
: không có chiều rộng bằng không (như không được chụp) khẳng định nhìn tích cực. Trận đấu trước sẽ chỉ có hiệu lực nếu nó được theo sau bởi"
theo nghĩa đen
)
: kết thúc nhóm bắt giữ, chúng tôi đã nắm bắt mọi thứ ở giữa phần mở đầu "
"
: một nghĩa đen, danh sách cf mục một
Sự thay thế là '$1'
, đây là một tham chiếu ngược đến nhóm bị bắt đầu tiên, đang tồn tại [^" ]+
hoặc xen vào giữa các dấu ngoặc kép. Mẫu phù hợp với cả dấu ngoặc kép và những gì nằm giữa chúng, nhưng chỉ thay thế nó bằng những gì ở giữa dấu ngoặc kép, do đó loại bỏ chúng một cách hiệu quả.
Những gì nó làm là some "string with" quotes
-> thay thế "string with"
bằng -> string with
. Báo giá đi, công việc đã hoàn thành.
Nếu các trích dẫn luôn luôn ở đầu và cuối của chuỗi, thì bạn có thể sử dụng điều này:
str.replace(/^"(.+(?="$))"$/, '$1');
Với đầu vào remove "foo" delimiting "
, đầu ra sẽ không thay đổi, nhưng thay đổi chuỗi đầu vào thành "remove "foo" delimiting quotes"
và bạn sẽ kết thúc bằng remove "foo" delimiting quotes
đầu ra.
Giải trình:
^"
: khớp với phần đầu của chuỗi ^
và a "
. Nếu chuỗi không bắt đầu bằng a "
, biểu thức đã thất bại ở đây và không có gì được thay thế.
(.+(?="$))
: khớp (và chụp) mọi thứ, kể cả trích dẫn kép một hoặc nhiều lần, với điều kiện là cái nhìn tích cực là đúng
(?="$)
: giao diện tích cực giống như trên, chỉ có điều nó xác định rằng "
phải là kết thúc của chuỗi ( $
=== end)
"$
: khớp với trích dẫn kết thúc, nhưng không nắm bắt được
Việc thay thế được thực hiện theo cách tương tự như trước đây: chúng tôi thay thế trận đấu (bao gồm các trích dẫn mở và kết thúc), với tất cả mọi thứ bên trong chúng.
Bạn có thể nhận thấy tôi đã bỏ qua g
cờ (đối với BTW toàn cầu), vì vì chúng tôi đang xử lý toàn bộ chuỗi, biểu thức này chỉ áp dụng một lần.
Một regex dễ dàng hơn, tương tự, có một điều tương tự (có sự khác biệt bên trong về cách regex được biên dịch / áp dụng) sẽ là:
someStr.replace(/^"(.+)"$/,'$1');
Như trước ^"
và "$
khớp với các trích dẫn phân định ở đầu và cuối của chuỗi, và (.+)
khớp với mọi thứ ở giữa và nắm bắt nó. Tôi đã thử regex này, cùng với cái ở trên (với sự khẳng định về cái nhìn) và, thừa nhận, với sự ngạc nhiên của tôi thấy cái này chậm hơn một chút. Tôi đoán là xác nhận nhìn có vẻ làm cho biểu thức trước đó bị hỏng ngay khi động cơ xác định không có "
ở cuối chuỗi. À, nhưng nếu đây là những gì bạn muốn / cần, xin vui lòng đọc tiếp :
Tuy nhiên, trong trường hợp cuối cùng này, nó an toàn hơn, nhanh hơn, dễ bảo trì hơn và tốt hơn để làm điều này:
if (str.charAt(0) === '"' && str.charAt(str.length -1) === '"')
{
console.log(str.substr(1,str.length -2));
}
Ở đây, tôi đang kiểm tra xem char đầu tiên và cuối cùng trong chuỗi có phải là dấu ngoặc kép hay không. Nếu có, tôi đang sử dụng substr
để cắt bỏ những ký tự đầu tiên và cuối cùng. Chuỗi không có chỉ mục, vì vậy char cuối cùng là charAt(str.length -1)
. substr
mong đợi 2 đối số, trong đó đầu tiên là phần bù mà chuỗi con bắt đầu, chuỗi thứ hai là độ dài của nó. Vì chúng ta không muốn char cuối cùng, hơn nữa chúng ta muốn thứ nhất, độ dài đó là str.length - 2
. Dễ đậu.
Mẹo :
Thông tin thêm về các xác nhận có vẻ có thể được tìm thấy ở đây
Regex rất hữu ích (và IMO vui vẻ), ban đầu có thể hơi khó hiểu. Dưới đây là một số chi tiết và liên kết đến các tài nguyên về vấn đề này.
Nếu bạn chưa cảm thấy thoải mái khi sử dụng regex, bạn có thể muốn xem xét sử dụng:
var noQuotes = someStr.split('"').join('');
Nếu có nhiều trích dẫn trong chuỗi, điều này thậm chí có thể nhanh hơn sử dụng regex