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 '
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 '
Yanıtlar:
Aramaları kullanarak kontroller yapabilirsiniz :
^(?=.*\bjack\b)(?=.*\bjames\b).*$
Bu yaklaşımın avantajı, birden çok koşulu kolayca belirleyebilmenizdir.
^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$
vim
sözdizimi: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$
veya\v^(.*<jack>)@=(.*<james>)@=.*$
^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$
maç başarısız blah #tgif blah #friday blah
ama iyi ^(?=.*\bfriday\b)(?=.*\btgif\b).*$
çalışıyor.
\b
Burada ne anlama geliyor?
Deneyin:
james.*jack
Her ikisini aynı anda istiyorsanız, o zaman or
:
james.*jack|jack.*james
james.*?jack|jack.*?james
. Bu büyük metinlerde yardımcı olacaktır.
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 jack
gelir.
Beri istediğiniz ya jack.*james
yajames.*jack
Dolayısıyla Komut :
jack.*james|james.*jack
Kısa ve tatlı
(?=.*jack)(?=.*james)
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
jack
ve james
herhangi 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 .
jack
ve Birjames
İki jack
veya ikiye james
izin verilmemesi durumunda, yalnızca bir jack
ve bir james
geç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)
Bunu basitleştirebiliriz,
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$
İ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 .
jex.im düzenli ifadeleri görselleştirir:
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}`);
});
}
jack
ve Birjames
Aşağıdakine benzer şekilde, james
sonuncusu için de tasarlanabilir jack
:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b.*\bjack\b).*$
ve tam tersi:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$