Saya mempunyai ungkapan biasa ini:
"(WORD1.*WORD2.*WORD3)|(WORD1.*WORD3.*WORD2)|(WORD2.*WORD1.*WORD3)|(WORD2.*WORD3.*WORD1)|(WORD3.*WORD1.*WORD2)|(WORD3.*WORD2.*WORD1)"
Ia sepadan dengan perkataan ini:
WORD1WORD2WORD3 WORD1AWORD2BWORD3C WORD3WORD1WORD2 WORD1WORD2WORD3WORD1
Tetapi bukan perkataan ini:
WORD1WORD1WORD2 WORD1AWORD1BWORD2C
Regex ini sepadan apabila ia menemui rentetan yang mengandungi 3 perkataan (WORD1
、WORD2
、WORD3
) dalam sebarang susunan.
Saya mahu melakukan perkara yang sama dengan lebih banyak perkataan, tetapi masalahnya ialah saiz regex berkembang secara eksponen dengan bilangan perkataan. Adakah mungkin untuk memudahkan cara regex ini dibina untuk menyelesaikan masalah ini (tanpa berkembang secara eksponen dalam saiz)?
Cuma lelaran pada semua rentetan dan tapis semua rentetan yang tidak mengandungi semua kata kunci:
(Versi yang lebih ringkas boleh didapati dalam coretan kod di bawah)
Cubalah:
Anda boleh menggunakan pandangan positif ke hadapan untuk setiap perkataan.
Versi yang lebih berprestasi di bawah menentukan sauh permulaan dan hanya sepadan dengan satu aksara selepas mengesahkan pandangan ke hadapan. Mengikut permintaan OP, teknik ini hanya berfungsi dengan
matching
,而不适用于extraction
.Pandangan ke hadapan adalah seperti pintu gerbang, ia hanya akan diteruskan jika perlawanan yang dinyatakan dalam kurungan wujud, tetapi ia tidak akan mengambil atau menangkap apa yang sepadan - ia sentiasa panjang sifar. Susunan perkataan tidak penting jika anda "pandang ke hadapan" untuk melihat sama ada terdapat
.*
mendahului setiap perkataan. Jika setiap perkataan adalah benar, teruskan tanpa menggunakan apa-apa untuk pemadanan. p>Jika anda hanya mengambil berat tentang sama ada kandungannya sepadan, satu-satunya perbezaan yang ketara antara kedua-dua ungkapan ialah masa yang diambil. Katakan anda hanya mempunyai 2 daripada 3 perkataan yang diperlukan dalam kandungan anda. Melainkan perisian yang mentafsir ungkapan itu dapat mengenali bahawa percubaan itu sia-sia, ia mungkin mencari tiga perkataan "gagal" di kedudukan pertama, kemudian cuba "gagal" di kedudukan kedua, dan seterusnya sehingga ia mencapai kedudukan terakhir naik. Beberapa tangkapan yang tidak perlu boleh dicegah dengan menyatakan
^
,只会在第一个位置进行检查,节省了其他不必要检查的时间。当您只是寻找内容中是否存在所有单词的真/假答案时,从末尾删除*
.