คุณต้องใช้ lookahead ตามที่ผู้ตอบคนอื่นได้กล่าวไว้ แต่ lookahead ต้องคำนึงถึงอักขระอื่น ๆ ระหว่างคำเป้าหมายและตำแหน่งการแข่งขันปัจจุบัน ตัวอย่างเช่น:
(?=.*word1)(?=.*word2)(?=.*word3)
.*
ใน lookahead แรกช่วยให้มันตรงกับตัวละครมาก แต่ก็ต้องก่อนที่จะได้รับการ "word1" จากนั้นตำแหน่งการแข่งขันจะถูกรีเซ็ตและ lookahead ที่สองจะค้นหา "word2" รีเซ็ตอีกครั้งและส่วนสุดท้ายตรงกับ "word3"; เนื่องจากเป็นคำสุดท้ายที่คุณกำลังตรวจสอบดังนั้นจึงไม่จำเป็นว่าต้องอยู่ในสถานะ lookahead แต่ไม่เจ็บ
เพื่อให้ตรงกับทั้งย่อหน้าคุณต้องยึด regex ที่ปลายทั้งสองและเพิ่มตัวสุดท้าย.*
เพื่อใช้อักขระที่เหลือ ใช้สัญลักษณ์สไตล์ Perl นั่นจะเป็น:
/^(?=.*word1)(?=.*word2)(?=.*word3).*$/m
ตัวปรับ 'm' ใช้สำหรับโหมดหลายบรรทัด มันช่วยให้^
และ$
จับคู่ที่ขอบเขตย่อหน้า ("ขอบเขตของเส้น" ใน regex-speak) เป็นสิ่งสำคัญในกรณีนี้ที่คุณไม่ต้องใช้ตัวปรับ 's' ซึ่งจะทำให้ dot metacharacter จับคู่บรรทัดใหม่และอักขระอื่น ๆ ทั้งหมด
ท้ายที่สุดคุณต้องการให้แน่ใจว่าคุณจับคู่ทั้งคำและไม่ใช่แค่ส่วนของคำที่ยาวกว่าดังนั้นคุณต้องเพิ่มขอบเขตของคำ:
/^(?=.*\bword1\b)(?=.*\bword2\b)(?=.*\bword3\b).*$/m