ฉันต้องการตรรกะและใน 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,}