Herhangi bir sırada iki ad içeren dizeyle eşleşecek şekilde normal ifade


180

Regex mantıksal VE gerekir.

gibi bir şey

jack VE james

aşağıdaki dizelere katılıyorum

  • 'merhaba jack burada james '

  • 'merhaba james burda jack '



@AndersonGreen, soru erken kilitlendi. Çoğu regex görünüm ve mod nicelleştiriciyi tanımadığından, bu çözümler uygun olmadığından cevaplar ciddi şekilde eksiktir . Sorunun sorulduğu noktada nicelik belirtecinin var olduğuna inanıyorum .
XPMai

Yanıtlar:


261

Aramaları kullanarak kontroller yapabilirsiniz :

^(?=.*\bjack\b)(?=.*\bjames\b).*$

Dene.

Bu yaklaşımın avantajı, birden çok koşulu kolayca belirleyebilmenizdir.

^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$

18
Birisi bu örneğin nasıl çalıştığını biraz daha ayrıntılı olarak açıklar mı?
bjmc

2
vimsözdizimi: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$veya\v^(.*<jack>)@=(.*<james>)@=.*$
mykhal

'#' İle başlayan dizeleri aramaya çalıştığımda bunun neden (en azından JavaScript'te) kırılacağını bilen var mı? ^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$maç başarısız blah #tgif blah #friday blahama iyi ^(?=.*\bfriday\b)(?=.*\btgif\b).*$çalışıyor.
btleffler

2
\bBurada ne anlama geliyor?
VarunAgw


106

Deneyin:

james.*jack

Her ikisini aynı anda istiyorsanız, o zaman or:

james.*jack|jack.*james

1
Kabul edilen cevap işe yaradı. bu da benim için mükemmel çalıştı. Görsel stüdyoda kod aramak için 'sonuçları bul'.
Bilge Yoğurt

1
Bu benim için çalışıyor ve kabul edilen cevaptan çok daha kısa ve anlaşılması kolay!
Kumar Manish

1
Eşleşmesi için sadece iki ismi olan bir çözüme ihtiyacım vardı, bu yüzden bu cevap bu dava için daha özlü. Ancak "veya" nin sayısı faktöriyel olarak arttığından, kabul edilen cevap 2'nin üzerinde daha özlü hale gelir. 3 isim için 6 "veya" s, 4 isim 24 "veya" s, vb.
Olacaktır

Tembel yapmak için tavsiye ederim james.*?jack|jack.*?james. Bu büyük metinlerde yardımcı olacaktır.
Jekis

42

Yazacağım komutun açıklaması : -

. herhangi bir karakter anlamına gelir, rakam yerine gelebilir.

* "Daha önce yazılmış bir şeyin sıfır veya daha fazla tekrarlanması" anlamına gelir.

|"veya" anlamına gelir .

Yani,

james.*jack

arama yaparsanız james , o zamana kadar herhangi bir sayıda karakter jackgelir.

Beri istediğiniz ya jack.*jamesyajames.*jack

Dolayısıyla Komut :

jack.*james|james.*jack

7
Bir yan not olarak, @ icyrock'un cevabını da düzenleyebilirsiniz (bu sadece 6 yıl önce sizinkiyle aynıdır), açıklamanız kendi başına çok yararlıdır.
WoJ

2
Bu cevap için teşekkür ederim, ancak VSCode arama, cevap jack işaret etmek gerekir hissediyorum . * James | james. * jack '|' arasındaki boşlukları alacaktır (veya) sembolü. jack. * james | james. * jack çalışıyor ve boşluk
aramıyor

2
$ _Explanation === "harika" EĞER sonra THUMBS_UP ENDIF $;
Syed Aqeel



2

Vim, bir \&dizi kelimeyi içeren bir satırı herhangi bir sırada ararken yararlı olan bir şube operatörüne sahiptir. Ayrıca, gerekli sözcük grubunu genişletmek önemsizdir.

Örneğin,

/.*jack\&.*james

jackve jamesherhangi bir sırayla içeren bir satırla eşleşir .

Kullanım hakkında daha fazla bilgi için bu cevaba bakınız . Dallanmayı uygulayan başka herhangi bir regex lezzetinin farkında değilim; operatör Normal İfade wikipedia girişinde belgelenmemiştir .


2

YÖNTEM 1: Bir jackve Birjames

İki jackveya ikiye jamesizin verilmemesi durumunda, yalnızca bir jackve bir jamesgeçerli olacaksa, aşağıdakine benzer bir ifade tasarlayabiliriz:

^(?!.*\bjack\b.*\bjack\b)(?!.*\bjames\b.*\bjames\b)(?=.*\bjames\b)(?=.*\bjack\b).*$

Burada, şu ifadeleri kullanarak bu çift örneklerini hariç tutacağız:

(?!.*\bjack\b.*\bjack\b)

ve,

(?!.*\bjames\b.*\bjames\b)

RegEx Demosu 1

Bunu basitleştirebiliriz,

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$

RegEx Demo 2


İfadeyi basitleştirmek / değiştirmek / keşfetmek istiyorsanız, regex101.com'un sağ üst panelinde açıklanmıştır . İsterseniz, bu bağlantıda bazı örnek girdilerle nasıl eşleşeceğini de izleyebilirsiniz .


RegEx Devresi

jex.im düzenli ifadeleri görselleştirir:

resim açıklamasını buraya girin

Ölçek

const regex = /^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$/gm;
const str = `hi jack here is james
hi james here is jack
hi james jack here is jack james
hi jack james here is james jack
hi jack jack here is jack james
hi james james here is james jack
hi jack jack jack here is james
`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}


YÖNTEM 2: Belirli sırada Bir jackve Birjames

Aşağıdakine benzer şekilde, jamessonuncusu için de tasarlanabilir jack:

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b.*\bjack\b).*$

RegEx Demo 3

ve tam tersi:

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$

RegEx Demosu 4


0

Her zaman desteklenmeyebileceğinden regex'in nicelik belirteci özelliğini kullanabilirsiniz lookaround.

(\b(james|jack)\b.*){2,}
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.