Saya perlu DAN logis dalam regex.
sesuatu seperti
jack DAN james
setuju dengan string berikut
'Hai jack disini james '
'Hai james di sini adalah jack '
Saya perlu DAN logis dalam regex.
sesuatu seperti
jack DAN james
setuju dengan string berikut
'Hai jack disini james '
'Hai james di sini adalah jack '
Jawaban:
Anda dapat melakukan pemeriksaan menggunakan lookarounds :
^(?=.*\bjack\b)(?=.*\bjames\b).*$
Pendekatan ini memiliki keuntungan yaitu Anda dapat dengan mudah menentukan berbagai kondisi.
^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$
vimsintaksis: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$atau\v^(.*<jack>)@=(.*<james>)@=.*$
^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$gagal mencocokkan blah #tgif blah #friday blahtetapi ^(?=.*\bfriday\b)(?=.*\btgif\b).*$berfungsi dengan baik.
\bartinya di sini?
Mencoba:
james.*jack
Jika Anda ingin keduanya sekaligus, maka ormereka:
james.*jack|jack.*james
james.*?jack|jack.*?james. Ini akan membantu pada teks besar.
Penjelasan perintah yang akan saya tulis : -
. berarti setiap karakter, digit dapat menggantikannya.
* berarti nol atau lebih kejadian dari sesuatu yang ditulis sebelum itu.
|berarti 'atau' .
Begitu,
james.*jack
akan mencari james , lalu sejumlah karakter hinggajack datang.
Karena Anda ingin salah satu jack.*jamesataujames.*jack
Oleh karena itu Perintah :
jack.*james|james.*jack
Pendek dan manis
(?=.*jack)(?=.*james)
Vim memiliki operator cabang \& yang berguna saat mencari garis yang berisi serangkaian kata, dalam urutan apa pun. Selain itu, memperluas rangkaian kata-kata yang diperlukan itu sepele.
Sebagai contoh,
/.*jack\&.*james
akan cocok dengan baris yang berisi jackdan james, dalam urutan apa pun.
Lihat jawaban ini untuk informasi lebih lanjut tentang penggunaan. Saya tidak mengetahui adanya rasa regex lain yang menerapkan percabangan; operator bahkan tidak didokumentasikan pada entri wikipedia Ekspresi Reguler .
jackdan SatujamesUntuk jaga-jaga, dua jackatau dua jamestidak akan diizinkan, hanya satu jackdan satu jamesakan valid, kita mungkin dapat merancang ekspresi yang mirip dengan:
^(?!.*\bjack\b.*\bjack\b)(?!.*\bjames\b.*\bjames\b)(?=.*\bjames\b)(?=.*\bjack\b).*$
Di sini, kami akan mengecualikan instance pasangan menggunakan, pernyataan ini:
(?!.*\bjack\b.*\bjack\b)
dan,
(?!.*\bjames\b.*\bjames\b)
Kami juga dapat menyederhanakan bahwa untuk,
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$
Jika Anda ingin menyederhanakan / memodifikasi / menjelajahi ekspresi, sudah dijelaskan di panel kanan atas regex101.com . Jika mau, Anda juga dapat menonton di tautan ini , bagaimana itu cocok dengan beberapa input sampel.
jex.im memvisualisasikan ekspresi reguler:
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}`);
});
}
jackdan Satu jamesdalam urutan tertentuItu dapat juga dirancang untuk yang jamesterakhir terakhir jack, mirip dengan yang berikut:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b.*\bjack\b).*$
dan sebaliknya:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$