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).*$
vim
sintaksis: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$
atau\v^(.*<jack>)@=(.*<james>)@=.*$
^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$
gagal mencocokkan blah #tgif blah #friday blah
tetapi ^(?=.*\bfriday\b)(?=.*\btgif\b).*$
berfungsi dengan baik.
\b
artinya di sini?
Mencoba:
james.*jack
Jika Anda ingin keduanya sekaligus, maka or
mereka:
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.*james
ataujames.*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 jack
dan 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 .
jack
dan Satujames
Untuk jaga-jaga, dua jack
atau dua james
tidak akan diizinkan, hanya satu jack
dan satu james
akan 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}`);
});
}
jack
dan Satu james
dalam urutan tertentuItu dapat juga dirancang untuk yang james
terakhir 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).*$