2010-08-15 35 views
36

Nedeniyle javascript bir çok regex şeyler yapmak gerekir ama sözdizimi ile bazı sorunlar yaşıyorum ve bu konuda kesin bir kaynak bulmak için görünmüyor .. Bazıları için sebebi bulduğumda:Regex, belirli bir nedenle 2 sonuç döndürüyor

var tesst = "afskfsd33j" 
var test = tesst.match(/a(.*)j/); 
alert (test) 

o ben sadece vermek nasıl alabilirim, merak ediyorum onun özgün bu çıktıyı ve eşleşen dize vererek neden emin değilim

"afskfsd33j, fskfsd33" 

gösterir eşleme (esas olarak orijinal dizeden istediğim parçayı ayıklamak)

Herhangi bir öneri için teşekkürler

+3

Durumunuzda orijinal ve eşleşmeyen dizinin bulunmadığından emin olun. "Afskfsd33j" eşleştirilmiş dizginiz var. Sonra regexp içinde parantez gelen ikinci öğe "fskfsd33": (. *) – Mic

cevap

73

match bir dizi döndürür.

JavaScript'teki bir dizinin varsayılan dize gösterimi, dizinin virgülle ayrılan öğeleridir. Bu durumda istenen sonuç dizinin ikinci elemanı içinde:

var tesst = "afskfsd33j" 
var test = tesst.match(/a(.*)j/); 
alert (test[1]); 
+1

ohh Tamam, sanırım özledim .. Teşekkürler, ben bazen daha kısıtlı bir baskı yolu alışkın beri javascript ile karıştırılır php – Rick

+1

dizileri Muhtemelen aptalca geliyor, ama neden orijinal dizgeyi döndürüyor? Bu konuda herhangi bir belge var mı? –

+4

@ john-lee Orijinal dizgenin regex '/ a (. *) J /' ile eşleşmesi ve dizinin ikinci girişinin ilk eşleşen grubu '(. *)' Içermesidir. Ayrıca grup (0) her zaman tüm eşleşmedir, oysa grup (n) parantezler ile işaretlenmiş n-th grubudur. Umarım bu daha fazla bilgi için bu belgeyi denemez eğer anlaşılabilir (https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/match) –

4

Ben senin sorunun maç yöntemi bir dizi dönen olduğunu düşünüyorum. Dizideki 0. Öğe, orijinal dizedir, ilk öğelerin sayısı 1 ile nth eşleşen parantezli öğelere karşılık gelir. "Alert()" aramanız dizinin tamamını gösteriyor.

+4

Bu yanlış veya sadece kötü bir şekilde ifade edilir. Dizideki ilk öğe ('test [0]') tüm dize değil, tüm regex tarafından eşleştirilen dizenin kısmıdır. Bu durumda aynı olurlar, ama eğer regex '/ f (. *) J /' olsaydı, sonuç 'fskfsd33j, skfsd33' olurdu (başlangıç' a' maçta yer almaz). . –

3

Sadece aynı problemi yaşadım.

Bir eşleşme grubu (parantez içinde) ve 'g' (genel) değiştiricisini eklediğinizde, metni yalnızca sonuçta iki kez elde edersiniz.

while ((result = reg.exec(string)) !== null){ 
    console.log(result); 
} 

sonuç biraz farklıdır: ancak böyle bir yapı kullanılırken, kısa ipte maç (reg) kullanılırken ilk öğe her normalde Tamam ilk sonucudur. @ Için

iyi cevap ben upvote edemez bir açıklama henüz, bu yüzden kredi -

var regEx = new RegExp('([0-9]+ (cat|fish))','g'), sampleString="1 cat and 2 fish"; 
var result = sample_string.match(regEx); 
console.log(JSON.stringify(result)); 
// ["1 cat","2 fish"] 

var reg = new RegExp('[0-9]+ (cat|fish)','g'), sampleString="1 cat and 2 fish"; 
while ((result = reg.exec(sampleString)) !== null) { 
    console.dir(JSON.stringify(result)) 
}; 
// '["1 cat","cat"]' 
// '["2 fish","fish"]' 

var reg = new RegExp('([0-9]+ (cat|fish))','g'), sampleString="1 cat and 2 fish"; 
while ((result = reg.exec(sampleString)) !== null){ 
    console.dir(JSON.stringify(result)) 
}; 
// '["1 cat","1 cat","cat"]' 
// '["2 fish","2 fish","fish"]' 

(Krom, node.js son V8 üzerinde test):

aşağıdaki kodu deneyin Mikrofon.

2

Parentez() tarafından tanımlanan her grup, işlem sırasında yakalanır ve yakalanan her grup içeriği, desen başlangıcı içindeki gruplar ile aynı sırada sonuç dizisine aktarılır.

dizide

İlk değer bütününü teyit ilk bulundu dizedir : http://www.regular-expressions.info/brackets.html ve http://www.regular-expressions.info/refcapture.html daha bakın

var source = "afskfsd33j" 
var result = source.match(/a(.*)j/); 

result: ["afskfsd33j", "fskfsd33"] 

bu kesin bir sonuç aldı nedeni takip ediyor (desteklenen özelliklerini görmek için doğru dili seçin) Desen. Bu yüzden kesinlikle "a" ile başlamalı ve ardından herhangi bir sayıda karakterle başlamalı ve "a" başladıktan sonra ilk "j" char ile biter.

Dizideki ikinci değer, parantez ile tanımlanan yakalanan gruptur. Vaka grubunuzda, parantez dışında tanımlanmış içerik olmadan tüm desen eşleşmesi bulunur, bu nedenle tam olarak "fskfsd33".

İsterseniz

böyle desen tanımlayabilir dizideki ikinci değer kurtulmak için:

/a(?:.*)j/ 

burada ":?" Anlamına geldiğini parantez içinde içerik parçası olmayacaktır eşleşen karakterlerin grup sonuç dizisi. hiç grubunu kullanmak gerekli değildir, çünkü

Diğer seçenekler herhangi bir gruba olmadan desen yazmak için bu basit durumda olabilir:

sadece kaynak metin deseni eşleşir ve yapar olmadığını kontrol etmek istiyorsanız
/a.*j/ 

Eğer deneyebilirsiniz olmadığı kadar bulduğu metni umurumda değil:

var result = /a.*j/.test(source); 

sonuç daha sonra tek gerçek dönmelidir | yanlış değerler. Daha fazla bilgi için bkz. http://www.javascriptkit.com/javatutors/re3.shtml

İlgili konular