Javascript'te parantezler arasında dize almak için Normal İfade


177

Parantez arasında bir dize döndüren normal bir ifade yazmaya çalışıyorum. Örneğin: "(" ve ")" dizeleri arasında bulunan dizeyi almak istiyorum

I expect five hundred dollars ($500).

dönecekti

$500

Javascript'te iki dize arasında bir dize almak için Normal İfade bulundu

Ama normal ifade ile yeniyim. Normal ifadede '(', ')' kullanmayı bilmiyorum



Dolar işareti için test etmek için biraz değiştirilmiş aşağıdaki go-oleg çözümünü kullanabilirsiniz:var regExp = /\(\$([^)]+)\)/;
Dom Day

Yanıtlar:


460

Sen kümesi oluşturmanız (ile kaçan \ve yakalama grubunu oluşturmak düzenli parantez bir grup (parantez eşleşmesini) parantezler):

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

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

Yıkmak:

  • \( : açılış parantezlerini eşleştirin
  • ( : grubu yakalamaya başla
  • [^)]+: bir veya daha fazla )karakter olmayan karakterle eşleş
  • ) : son yakalama grubu
  • \) : maç kapanış parantezleri

İşte RegExplained hakkında görsel bir açıklama


12
+1 Güzel, çekicilik gibi çalıştı. Görsel bir açıklama için bu tinyurl.com/mog7lr3 eklemek için eklemek istiyorum .
Praveen

5
@ user1671639: Güncellendi. Bağlantı için teşekkürler!
go-oleg

5
Yakalamak istediğiniz parantez içinde parantez varsa bu çalışmaz. Örneğin: "Beş yüz dolar bekliyorum (500 dolar (ama o parayı bir daha asla göremeyeceğimi biliyorum))."
JayB

1
Bu normal ifade, her sokma için bir örnek eşleştirilirse çalışır. Küresel /gbayrağı kullanmak beklendiği gibi çalışmaz.
silkAdmin

2
aşağıdaki gibi parantez içinde birden fazla dizeleri varsa çözüm nedir: "Ben bekliyorum (beş) yüz dolar (500 $)" diyelim ki bu özel dizelerin bir dizi istiyorum.
Mohamad Al Asmar

33

Dize değiştirmeyi deneyin:

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

veya normal ifade ( yukarıdakilere kıyasla biraz yavaş )

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
O jsperf'i bugün Chrome 59.0.3071'de çalıştıran normal ifade% 8 daha hızlıydı
Alex McMillan


8

Basit çözüm

Uyarı : Bu çözüm, bu soruda yalnızca tek "(" ve ")" gibi bir dizeye sahip dizeler için kullanılabilir.

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

Çevrimiçi demo (jsfiddle)


5

Para birimi işaretinden sonraki rakamlar için: \(.+\s*\d+\s*\)çalışmalı

Veya \(.+\)parantez içindeki herhangi bir şey için


2
Bu örnek metin için işe yarayacaktır, ancak )dize daha sonra ortaya çıkarsa I expect five hundred dollars ($500). (but I'm going to pay)., açgözlülüğün açgözlülüğü gibi +çok daha fazlasını yakalar.
Ro Yo Mi

@Denomales Peki bu dizelerin her iki örneğini nasıl yakalarsınız? İdeal olarak ben benzer bir şey yapıyorum ama sahip olmak istiyorum: ($500)ve (but I'm going to pay) eşleşmek ama iki eşleşen maçlar yerine tek bir eşleşen öğe olarak kabul? Şimdiden teşekkürler!
Tom Bird

(. +) benim ihtiyacım için çalıştı. "Dunhill (Şişe / Paket / Pot / Shot)" gibi maddeleri yakalamak ve sadece "Dunhill" geri dönmek gerekiyor
GentleGiant

5

Kullanabileceğiniz iç parantezler hariç parantez içindeki bir alt dizeyi eşleştirmek için

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

Desen. Bkz regex demo .

JavaScript'te şöyle kullanın:

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

Desen ayrıntıları

  • \(- (karakter
  • ([^()]*)- Yakalama grubu 1: ve dışında herhangi bir 0 veya daha fazla karakterle eşleşen , reddedilen bir karakter sınıfı( ve)
  • \)- bir )karakter.

Tüm eşleşmeyi elde etmek için, Grup 0 değerini alın, parantez içindeki metne ihtiyacınız varsa, Grup 1 değerini alın.

En güncel JavaScript kodu demosu (kullanılarak 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
});

Eski JavaScript kod demosu (ES5 uyumlu):


Bu normal ifade harika çünkü sadece () yan yana olsalar bile ve içeriklerini()() .
limitlessloop

1
@limitlessloop Bu faydalı bir yanıt gibi göründüğünden, yeni bir matchAll JavaScript kod demosu .
Wiktor Stribiżew

3

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


2

Alternatif:

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

İhtiyacınız varsa braketleri kare veya kıvırcık braketlerle değiştirmek mümkündür.


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

İlk sayı $ ile başlayan ve ardından ')' ile eşleşecektir. ')' maçın bir parçası olmayacak. Kod ilk eşleşmeyle uyarır.

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

Bu kod tüm eşleşmelerle uyarır.

Referanslar:

"? = n" için arama yap http://www.w3schools.com/jsref/jsref_obj_regexp.asp

"x (? = y)" için arama yap https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.