Regex untuk mencocokkan string yang berisi dua nama dalam urutan apa pun


180

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 '



@AndersonGreen, pertanyaannya dikunci sebelum waktunya. Jawabannya sangat kurang karena solusi tersebut tidak dapat digunakan karena sebagian besar regex tidak mengenali lookaround dan mode quantifier . Saya percaya quantifier ada pada titik pertanyaan yang diajukan.
XPMai

Jawaban:


261

Anda dapat melakukan pemeriksaan menggunakan lookarounds :

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

Menguji.

Pendekatan ini memiliki keuntungan yaitu Anda dapat dengan mudah menentukan berbagai kondisi.

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

18
Adakah yang bisa menjelaskan lebih detail bagaimana contoh ini bekerja?
bjmc

2
vimsintaksis: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$atau\v^(.*<jack>)@=(.*<james>)@=.*$
mykhal

Adakah yang tahu mengapa ini akan putus (setidaknya dalam JavaScript) ketika saya mencoba mencari string yang dimulai dengan '#'? ^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$gagal mencocokkan blah #tgif blah #friday blahtetapi ^(?=.*\bfriday\b)(?=.*\btgif\b).*$berfungsi dengan baik.
btleffler

2
Apa \bartinya di sini?
VarunAgw


106

Mencoba:

james.*jack

Jika Anda ingin keduanya sekaligus, maka ormereka:

james.*jack|jack.*james

1
Jawaban yang diterima berhasil. ini juga bekerja dengan baik untuk saya. Untuk mencari kode di studio visual 'temukan hasil'.
Yogurt The Wise

1
Yang ini berfungsi untuk saya dan jauh lebih ringkas & mudah dipahami daripada jawaban yang diterima!
Kumar Manish

1
Saya membutuhkan solusi yang hanya memiliki dua nama yang cocok, jadi jawaban ini lebih ringkas untuk kasus itu. Tetapi jawaban yang diterima menjadi lebih singkat dari 2 karena jumlah "atau" meningkat secara faktorial. Untuk 3 nama akan ada 6 "atau" s, 4 nama akan menjadi 24 "atau" s, dll.
WileCau

Saya akan merekomendasikan untuk membuatnya malas james.*?jack|jack.*?james. Ini akan membantu pada teks besar.
Jekis

42

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

7
Sebagai catatan tambahan - Anda juga dapat mengedit jawaban @ icyrock (yang sama dengan milik Anda, hanya 6 tahun sebelumnya), penjelasan Anda sangat berguna.
WoJ

2
Terima kasih atas jawaban ini, namun saya merasa perlu menunjukkan bahwa dalam pencarian VSCode, jack jawaban Anda . * James | james. * jack akan mengambil spasi di antara '|' (atau) simbol menjadi pertimbangan selama pencarian. jack. * james | james. * jack berfungsi dan tidak mencari spasi
jgritten

2
JIKA $ _explanation === "luar biasa" LALU kembalikan $ THUMBS_UP ENDIF;
Syed Aqeel


6

Anda dapat melakukan:

\bjack\b.*\bjames\b|\bjames\b.*\bjack\b

2

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 .


2

METODE 1: Satu jackdan Satujames

Untuk 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)

Demo RegEx 1

Kami juga dapat menyederhanakan bahwa untuk,

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

Demo RegEx 2


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.


Sirkuit RegEx

jex.im memvisualisasikan ekspresi reguler:

masukkan deskripsi gambar di sini

Uji

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}`);
    });
}


METODE 2: Satu jackdan Satu jamesdalam urutan tertentu

Itu dapat juga dirancang untuk yang jamesterakhir terakhir jack, mirip dengan yang berikut:

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

Demo RegEx 3

dan sebaliknya:

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

Demo RegEx 4


0

Anda dapat menggunakan fitur quantifier regex karena lookaroundmungkin tidak didukung sepanjang waktu.

(\b(james|jack)\b.*){2,}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.