2013-08-28 17 views
5

Çok normal ifadeyi anlamıyorum ve iki dizeyle eşleşen bir tane oluşturmak istiyorum.İki dizeyle eşleşen Javascript normal ifadesi

Bir dize için kod .match(/something/) olduğunu biliyoruz ve

.match(/something|someotherthing/) nasıl hem dizeleri

"microsoft google" Örneğin metnin bulunması durumunda sadece eşleşeni yazmak için iki dizeleri üzerinde eşleşmeleri ise

cevap

9

Tek bir düzenli ifadeyle yapmak için, her iki sırada da gelebileceklerini dikkate almanız gerekir. (.* iki alt dizeleri arasına herhangi bir karakter eşleşir):

/google.*microsoft|microsoft.*google/ 

Not: Bu ipin ucu alacağı 2'den fazla alt dizeleri yapmak istiyorsa. 3 dizi 6 farklı sipariş, 5 dizeleri 120 siparişleri gelebilir, ve 10 altbölümler 3628800 farklı şekillerde sipariş edilebilir! Bu nedenle Patlama Hapları yanıtında olduğu gibi, dilin (Javascript) özelliklerinin kullanılması, düzenli bir ifadeyle çok fazla uğraşmaya çalışmaktan çok daha iyi olabilir.

5

Sadece Ayrıca

.match(/google.*microsoft|microsoft.*google/) 
+0

@ m.buettner mükemmel nokta. –

+0

"Match" ı iki kez kullanabileceğimi biliyorum ama bunu daha kısa yapmak için regex ile istedim .. ama regex ile "match" iki kez kullanmaktan daha uzun gibi görünüyor – Enve

+0

@Enve kısa kodu mutlaka en çok okunabilir bir. Özellikle "uzun" kod zaten bir veya iki satırda uyuyorsa. Karmaşık ifadeyi kullanarak –

6

diğer cevaplar mükemmel olan bir ayrıntılı normal ifadeler kullanabilirsiniz o .indexOf

kullanmak daha hızlı olabilir Bu durumda .match iki kez

str.match(/google/) && str.match(/microsoft/) 

kullanabilirsiniz özel probleminiz için iyi, ama iki kelimeden fazla olduğunda Paulpro'nun dikkat çektiği gibi.

En kolay yol, Patlama Hapı'nın önerdiği gibi çoklu kontroller kullanmaktır.

Ancak daha ölçeklenebilir için

regex okunur yaklaşım sen lookaheads kullanabilirsiniz:

/^(?=.*google)(?=.*microsoft)(?=.*apple).../ 

ilk şart (.*google ölcüsemedigi) kontrol edilir sonra çok lookahead aslında hiçbir şey tüketmez, öyle dize başında geri ve sonraki koşulu kontrol edebilirsiniz. Model sadece tüm lookaheads yaparsa geçer. girişinizi Satır sonlarını içerebilir eğer .* yapmayacağım

Not. Bunun yerine [^]* veya [\s\S]*'u kullanmanız gerekecek (aynı şekilde diğerlerinin cevapları için de geçerli).

İlgili konular