@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 :
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.
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
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;
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 .
Untuk jaga-jaga, dua jackatau dua jamestidak akan diizinkan, hanya satu jackdan satu jamesakan valid, kita mungkin dapat merancang ekspresi yang mirip dengan:
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.
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 matchesif(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}`);});}
Jawaban:
Anda dapat melakukan pemeriksaan menggunakan lookarounds :
Menguji.
Pendekatan ini memiliki keuntungan yaitu Anda dapat dengan mudah menentukan berbagai kondisi.
sumber
vim
sintaksis:^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$
atau\v^(.*<jack>)@=(.*<james>)@=.*$
^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$
gagal mencocokkanblah #tgif blah #friday blah
tetapi^(?=.*\bfriday\b)(?=.*\btgif\b).*$
berfungsi dengan baik.\b
artinya di sini?Mencoba:
Jika Anda ingin keduanya sekaligus, maka
or
mereka:sumber
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,
akan mencari
james
, lalu sejumlah karakter hinggajack
datang.Karena Anda ingin salah satu
jack.*james
ataujames.*jack
Oleh karena itu Perintah :
sumber
Pendek dan manis
sumber
Anda dapat melakukan:
sumber
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
danjames
, 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 .
sumber
METODE 1: Satu
jack
dan Satujames
Untuk jaga-jaga, dua
jack
atau duajames
tidak akan diizinkan, hanya satujack
dan satujames
akan valid, kita mungkin dapat merancang ekspresi yang mirip dengan:Di sini, kami akan mengecualikan instance pasangan menggunakan, pernyataan ini:
dan,
Demo RegEx 1
Kami juga dapat menyederhanakan bahwa untuk,
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:
Uji
METODE 2: Satu
jack
dan Satujames
dalam urutan tertentuItu dapat juga dirancang untuk yang
james
terakhir terakhirjack
, mirip dengan yang berikut:Demo RegEx 3
dan sebaliknya:
Demo RegEx 4
sumber
Anda dapat menggunakan fitur quantifier regex karena
lookaround
mungkin tidak didukung sepanjang waktu.sumber