Ekspresi Reguler untuk mendapatkan string antara tanda kurung di Javascript

178

Saya mencoba untuk menulis ekspresi reguler yang mengembalikan string yang berada di antara tanda kurung. Misalnya: Saya ingin mendapatkan string yang berada di antara string "(" dan ")"

I expect five hundred dollars ($500).

akan kembali

$500

Ditemukan Ekspresi Reguler untuk mendapatkan string antara dua string dalam Javascript

Tapi saya baru dengan regex. Saya tidak tahu cara menggunakan '(', ')' di regexp

Okky
sumber
Anda dapat menggunakan solusi go-oleg di bawah ini, sedikit dimodifikasi untuk menguji tanda dolar:var regExp = /\(\$([^)]+)\)/;
Dom Day

Jawaban:

461

Anda perlu membuat satu set \tanda kurung lolos (dengan ) (yang cocok dengan tanda kurung) dan sekelompok tanda kurung biasa yang membuat grup penangkap Anda:

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

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

Kerusakan:

  • \( : cocok dengan tanda kurung pembuka
  • ( : mulai menangkap grup
  • [^)]+: cocokkan satu atau lebih )karakter non
  • ) : akhir grup penangkap
  • \) : mencocokkan tanda kurung

Berikut adalah penjelasan visual tentang RegExplained

pergi-oleg
sumber
12
+1 Bagus, bekerja seperti pesona. Saya ingin menambahkan Anda untuk menambahkan tinyurl.com/mog7lr3 ini di Anda untuk penjelasan visual.
Praveen
5
@ user1671639: Diperbarui. Terima kasih untuk tautannya!
go-oleg
5
Ini tidak berfungsi jika ada tanda kurung di dalam tanda kurung yang ingin Anda tangkap. Seperti: "Saya mengharapkan lima ratus dolar ($ 500 (tapi saya tahu saya tidak akan pernah melihat uang itu lagi))."
JayB
1
Regex ini hanya berfungsi jika mencocokkan satu instance per sengatan. Menggunakan /gbendera global tidak akan berfungsi seperti yang diharapkan.
silkAdmin
2
apa solusinya jika Anda memiliki banyak string di dalam tanda kurung seperti di bawah ini: "Saya perkirakan (lima) ratus dolar ($ 500)" katakan saja saya ingin sebuah array dari string-string khusus itu.
Mohamad Al Asmar
33

Coba manipulasi string:

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

atau regex ( yang agak lambat dibandingkan dengan yang di atas )

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));
}
Tuan_Green
sumber
7
Menjalankan jsperf itu hari ini di Chrome 59.0.3071, regex lebih cepat 8%
Alex McMillan
9

Ported jawaban Mr_Green untuk gaya pemrograman fungsional untuk menghindari penggunaan variabel global sementara.

var matches = string2.split('[')
  .filter(function(v){ return v.indexOf(']') > -1})
  .map( function(value) { 
    return value.split(']')[0]
  })
sutra sutera
sumber
Apa yang saya cari. stackoverflow.com/questions/49614116/…
wobsoriano
8

Solusi sederhana

Perhatikan : solusi ini dapat digunakan untuk string yang hanya memiliki string tunggal "(" dan ")" dalam pertanyaan ini.

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

Demo online (jsfiddle)

Ali Soltani
sumber
5

Untuk hanya digit setelah tanda mata uang: \(.+\s*\d+\s*\)harus berfungsi

Atau \(.+\)untuk apa pun di dalam kurung

P0W
sumber
2
Ini akan berfungsi untuk teks sampel, namun jika yang lain )muncul kemudian dalam string seperti I expect five hundred dollars ($500). (but I'm going to pay).keserakahan +akan menangkap lebih banyak.
Ro Yo Mi
@Denomales Jadi bagaimana Anda membuatnya menangkap kedua contoh dari string tersebut. Idealnya saya melakukan sesuatu yang serupa tetapi saya ingin memiliki: ($500)dan (but I'm going to pay) dicocokkan tetapi dalam dua pertandingan terpisah daripada dianggap sebagai barang yang cocok satu? Terima kasih sebelumnya!
Tom Bird
(. +) berfungsi untuk kebutuhan saya. Diperlukan untuk menangkap barang-barang seperti "Dunhill (Botol / Paket / Panci / Tembakan)" dan kembali hanya "Dunhill"
GentleGiant
5

Untuk mencocokkan substring di dalam tanda kurung tidak termasuk tanda kurung dalam yang dapat Anda gunakan

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

pola. Lihat yang demo regex .

Dalam JavaScript, gunakan seperti

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

Detail pola

Untuk mendapatkan seluruh kecocokan, ambil nilai Grup 0, jika Anda membutuhkan teks di dalam tanda kurung, ambil nilai Grup 1.

Demo kode JavaScript terbaru (menggunakan 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
});

Demo kode JavaScript lama (Sesuai ES5):

Wiktor Stribiżew
sumber
Regex ini bagus karena hanya menangkap pasangan ()dan isinya, bahkan ketika berdampingan ()().
limitlessloop
1
@limitlessloop Karena ini sepertinya jawaban yang membantu, saya juga menambahkan matchAlldemo kode JavaScript baru .
Wiktor Stribiżew
3

let str = "Before brackets (Inside brackets) After brackets".replace(/.*\(|\).*/g, '');
console.log(str) // Inside brackets

Andran
sumber
2

Alternatif:

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

Dimungkinkan untuk mengganti kurung dengan kurung kotak atau keriting jika Anda membutuhkannya

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

Akan cocok dengan angka pertama dimulai dengan $ dan diikuti oleh ')'. ')' tidak akan menjadi bagian dari pertandingan. Kode tersebut mengingatkan dengan pertandingan pertama.

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

Kode ini mengingatkan dengan semua kecocokan.

Referensi:

mencari "? = n" http://www.w3schools.com/jsref/jsref_obj_regexp.asp

cari "x (? = y)" https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp

AJ Dhaliwal
sumber