Biểu thức chính quy để có được một chuỗi giữa các dấu ngoặc đơn trong Javascript


177

Tôi đang cố gắng viết một biểu thức chính quy trả về một chuỗi nằm giữa dấu ngoặc đơn. Ví dụ: Tôi muốn lấy chuỗi nằm giữa các chuỗi "(" và ")"

I expect five hundred dollars ($500).

sẽ trở lại

$500

Đã tìm thấy Biểu thức chính quy để có được một chuỗi giữa hai chuỗi trong Javascript

Nhưng tôi mới với regex. Tôi không biết cách sử dụng '(', ')' trong regrec



bạn có thể sử dụng giải pháp của go-oleg bên dưới, sửa đổi một chút để kiểm tra ký hiệu đô la:var regExp = /\(\$([^)]+)\)/;
Ngày Dom

Câu trả lời:


460

Bạn cần tạo một tập hợp \dấu ngoặc đơn (có ) dấu ngoặc (khớp với dấu ngoặc đơn) và một nhóm dấu ngoặc đơn thông thường tạo nhóm bắt giữ của bạn:

var regExp = /\(([^)]+)\)/;
var matches = regExp.exec("I expect five hundred dollars ($500).");

//matches[1] contains the value between the parentheses
console.log(matches[1]);

Phá vỡ:

  • \( : khớp với dấu ngoặc đơn mở
  • ( : bắt đầu chụp nhóm
  • [^)]+: khớp một hoặc nhiều )ký tự không
  • ) : kết thúc nhóm bắt
  • \) : kết thúc dấu ngoặc đơn

Dưới đây là một lời giải thích trực quan trên RegExplained


12
+1 Đẹp, làm việc như một lá bùa. Tôi muốn thêm bạn để thêm tinyurl.com/mog7lr3 này vào phần giải thích trực quan của bạn.
Praveen

5
@ user1671639: Đã cập nhật. Cảm ơn các liên kết!
go-oleg

5
Điều này không hoạt động nếu có dấu ngoặc đơn trong ngoặc đơn bạn muốn chụp. Chẳng hạn như: "Tôi mong đợi năm trăm đô la (500 đô la (nhưng tôi biết tôi sẽ không bao giờ gặp lại số tiền đó))."
JayB

1
Regex này chỉ hoạt động nếu khớp một thể hiện trên mỗi sting. Sử dụng /gcờ toàn cầu sẽ không hoạt động như mong đợi.
lụaAdmin

2
Giải pháp là gì nếu bạn có nhiều chuỗi bên trong dấu ngoặc đơn như dưới đây: "Tôi mong đợi (năm) trăm đô la (500 đô la)" giả sử tôi muốn có một chuỗi các chuỗi đặc biệt đó.
Mohamad Al Asmar

33

Hãy thử thao tác chuỗi:

var txt = "I expect five hundred dollars ($500). and new brackets ($600)";
var newTxt = txt.split('(');
for (var i = 1; i < newTxt.length; i++) {
    console.log(newTxt[i].split(')')[0]);
}

hoặc regex ( hơi chậm so với ở trên )

var txt = "I expect five hundred dollars ($500). and new brackets ($600)";
var regExp = /\(([^)]+)\)/g;
var matches = txt.match(regExp);
for (var i = 0; i < matches.length; i++) {
    var str = matches[i];
    console.log(str.substring(1, str.length - 1));
}

7
Chạy jsperf hôm nay trong Chrome 59.0.3071, regex nhanh hơn 8%
Alex McMillan


8

Giải pháp đơn giản

Lưu ý : giải pháp này có thể được sử dụng cho các chuỗi chỉ có chuỗi giống như "(" và ")" trong câu hỏi này.

("I expect five hundred dollars ($500).").match(/\((.*)\)/).pop();

Bản demo trực tuyến (jsfiddle)


5

Đối với chỉ các chữ số sau một ký hiệu tiền tệ: \(.+\s*\d+\s*\)nên hoạt động

Hoặc \(.+\)cho bất cứ điều gì trong ngoặc


2
Điều này sẽ làm việc cho văn bản mẫu, tuy nhiên nếu một cái khác )xuất hiện sau đó trong chuỗi như I expect five hundred dollars ($500). (but I'm going to pay).sự tham lam của ý +chí sẽ nắm bắt được nhiều hơn nữa.
Ro Yo Mi

@Denomales Vậy làm thế nào bạn có thể nắm bắt cả hai trường hợp của các chuỗi đó. Lý tưởng nhất là tôi đang làm một cái gì đó tương tự nhưng tôi muốn có: ($500)(but I'm going to pay) được khớp nhưng trong hai trận đấu riêng biệt thay vì được coi là một mục phù hợp? Cảm ơn trước!
Tom Bird

(. +) làm việc cho yêu cầu của tôi. Cần thiết để chụp những thứ như "Duoping (Chai / Gói / Bình / Bắn)" và trở lại chỉ là "
Duoping

5

Để khớp với một chuỗi con bên trong dấu ngoặc đơn trừ bất kỳ dấu ngoặc đơn bên trong nào bạn có thể sử dụng

\(([^()]*)\)

mẫu. Xem các bản demo regex .

Trong JavaScript, sử dụng nó như

var rx = /\(([^()]*)\)/g;

Chi tiết hoa văn

  • \(- một (char
  • ([^()]*)- Nắm bắt nhóm 1: một lớp ký tự bị phủ định khớp với bất kỳ 0 hoặc nhiều ký tự khác ngoài ()
  • \)- một )char.

Để có được toàn bộ kết quả khớp, hãy lấy giá trị Nhóm 0, nếu bạn cần văn bản bên trong dấu ngoặc đơn, hãy lấy giá trị Nhóm 1.

Bản demo mã JavaScript cập nhật nhất (sử dụng matchAll):

const strs = ["I expect five hundred dollars ($500).", "I expect.. :( five hundred dollars ($500)."];
const rx = /\(([^()]*)\)/g;
strs.forEach(x => {
  const matches = [...x.matchAll(rx)];
  console.log( Array.from(matches, m => m[0]) ); // All full match values
  console.log( Array.from(matches, m => m[1]) ); // All Group 1 values
});

Bản demo mã JavaScript kế thừa (tuân thủ ES5):


Regex này là tuyệt vời vì nó chỉ nắm bắt các cặp ()và nội dung của chúng, ngay cả khi cạnh nhau ()().
giới hạn

1
@limitlessloop Vì đây có vẻ là một câu trả lời hữu ích, tôi cũng đã thêm một matchAllbản demo mã JavaScript mới .
Wiktor Stribiżew


2

Thay thế:

var str = "I expect five hundred dollars ($500) ($1).";
str.match(/\(.*?\)/g).map(x => x.replace(/[()]/g, ""));
 (2) ["$500", "$1"]

Có thể thay thế dấu ngoặc bằng dấu ngoặc vuông hoặc xoăn nếu bạn cần


1
var str = "I expect five hundred dollars ($500) ($1).";
var rex = /\$\d+(?=\))/;
alert(rex.exec(str));

Sẽ khớp với số đầu tiên bắt đầu bằng $ và theo sau là ')'. ')' sẽ không phải là một phần của trận đấu. Các mã thông báo với trận đấu đầu tiên.

var str = "I expect five hundred dollars ($500) ($1).";
var rex = /\$\d+(?=\))/g;
var matches = str.match(rex);
for (var i = 0; i < matches.length; i++)
{
    alert(matches[i]);
}

Mã này cảnh báo với tất cả các trận đấu.

Người giới thiệu:

tìm kiếm "? = n" http://www.w3schools.com/jsref/jsref_obj_regapid.asp

tìm kiếm "x (? = y)" https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp

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.