ฉันต้องการตรรกะและใน regex
สิ่งที่ต้องการ
แจ็คและเจมส์
เห็นด้วยกับสตริงดังต่อไปนี้
' แจ็คสวัสดีนี่คือเจมส์ '
'สวัสดีเจมส์นี่คือแจ็ค '
ฉันต้องการตรรกะและใน regex
สิ่งที่ต้องการ
แจ็คและเจมส์
เห็นด้วยกับสตริงดังต่อไปนี้
' แจ็คสวัสดีนี่คือเจมส์ '
'สวัสดีเจมส์นี่คือแจ็ค '
คำตอบ:
คุณสามารถทำการตรวจสอบโดยใช้lookarounds :
^(?=.*\bjack\b)(?=.*\bjames\b).*$
วิธีนี้มีข้อดีที่คุณสามารถระบุหลายเงื่อนไขได้อย่างง่ายดาย
^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$
vimไวยากรณ์: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$หรือ\v^(.*<jack>)@=(.*<james>)@=.*$
^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$ไม่สามารถจับคู่ได้blah #tgif blah #friday blahแต่ใช้^(?=.*\bfriday\b)(?=.*\btgif\b).*$งานได้ดี
\bนี่หมายความว่าอย่างไร
ลอง:
james.*jack
หากคุณต้องการทั้งสองอย่างในเวลาเดียวกันorพวกเขา:
james.*jack|jack.*james
james.*?jack|jack.*?jamesฉันจะแนะนำที่จะทำให้มันขี้เกียจ ซึ่งจะช่วยในตำราขนาดใหญ่
คำอธิบายของคำสั่งที่ฉันจะเขียน : -
. หมายถึงตัวอักษรตัวเลขใด ๆ สามารถเข้ามาแทนที่
* หมายถึงสิ่งที่เกิดขึ้นเป็นศูนย์หรือมากกว่านั้นที่เขียนไว้ก่อนหน้านี้
|หมายถึง'หรือ'
ดังนั้น,
james.*jack
จะค้นหาjames จากนั้นจึงมีจำนวนอักขระจนกระทั่งjackถึง
เนื่องจากคุณต้องการอย่างใดอย่างหนึ่งjack.*jamesหรือjames.*jack
ดังนั้นคำสั่ง :
jack.*james|james.*jack
มันสั้นและหวาน
(?=.*jack)(?=.*james)
คุณทำได้:
\bjack\b.*\bjames\b|\bjames\b.*\bjack\b
Vim มีตัวดำเนินการสาขา\&ที่มีประโยชน์เมื่อค้นหาบรรทัดที่มีชุดของคำในลำดับใด ๆ ยิ่งกว่านั้นการขยายชุดคำที่ต้องการนั้นเป็นเรื่องเล็กน้อย
ตัวอย่างเช่น,
/.*jack\&.*james
จะจับคู่บรรทัดที่มีjackและjamesในลำดับใด ๆ
ดูคำตอบนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้งาน ฉันไม่ทราบถึงรสชาติอื่น ๆ ของ regex ที่ใช้การแตกแขนง; ผู้ประกอบการไม่ได้รับการบันทึกไว้ในรายการ wikipedia ปกติ
jackและหนึ่งjamesในกรณีที่สองjackหรือสองjamesจะไม่ได้รับอนุญาตเพียงคนเดียวjackและหนึ่งjamesจะถูกต้องเราจะสามารถออกแบบการแสดงออกคล้ายกับ:
^(?!.*\bjack\b.*\bjack\b)(?!.*\bjames\b.*\bjames\b)(?=.*\bjames\b)(?=.*\bjack\b).*$
ที่นี่เราจะแยกอินสแตนซ์ของคู่เหล่านั้นโดยใช้ข้อความเหล่านี้
(?!.*\bjack\b.*\bjack\b)
และ,
(?!.*\bjames\b.*\bjames\b)
เรายังสามารถทำให้มันง่ายขึ้น
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$
หากคุณต้องการที่จะลดความซับซ้อน / การแก้ไข / การสำรวจการแสดงออกก็ถูกอธิบายอยู่ด้านบนขวาของแผงregex101.com หากคุณต้องการคุณยังสามารถดูในลิงค์นี้ว่ามันจะตรงกับอินพุตตัวอย่างบางส่วนได้อย่างไร
jex.imเห็นภาพการแสดงออกปกติ:
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และหนึ่งjamesในลำดับที่เฉพาะเจาะจงมันสามารถถูกออกแบบสำหรับครั้งแรกที่jamesผ่านjackมาคล้ายกับคนต่อไปนี้:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b.*\bjack\b).*$
และในทางกลับกัน:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$
คุณสามารถทำให้การใช้ regex ของปริมาณคุณลักษณะตั้งแต่lookaroundอาจจะไม่ได้รับการสนับสนุนตลอดเวลา
(\b(james|jack)\b.*){2,}