ฉันต้องการจับคู่นิพจน์ทั่วไปกับทั้งคำ
ในตัวอย่างต่อไปนี้ผมกำลังพยายามที่จะตรงsหรือseasonแต่สิ่งที่ฉันมีแมตช์s, e, a, และ on
[s|season]
ฉันจะสร้างนิพจน์ทั่วไปเพื่อจับคู่ทั้งคำได้อย่างไร
ฉันต้องการจับคู่นิพจน์ทั่วไปกับทั้งคำ
ในตัวอย่างต่อไปนี้ผมกำลังพยายามที่จะตรงsหรือseasonแต่สิ่งที่ฉันมีแมตช์s, e, a, และ on
[s|season]
ฉันจะสร้างนิพจน์ทั่วไปเพื่อจับคู่ทั้งคำได้อย่างไร
คำตอบ:
วงเล็บมีความหมายสำหรับตัวละครคลาสและคุณจริงพยายามที่จะตรงกับคนใดคนหนึ่งของ: s, |, s(อีกครั้ง) e, a, s(อีกครั้ง) และon
ใช้วงเล็บแทนการจัดกลุ่ม:
(s|season)
หรือกลุ่มที่ไม่จับภาพ:
(?:s|season)
หมายเหตุ: กลุ่มที่ไม่จับภาพจะบอกเครื่องยนต์ว่าไม่จำเป็นต้องจัดเก็บการจับคู่ในขณะที่อีกกลุ่มหนึ่ง (จับภาพกลุ่ม) สำหรับงานเล็ก ๆ ทั้งงานสำหรับงานหนักคุณอาจต้องการดูก่อนว่าคุณต้องการสิ่งที่ตรงกันหรือไม่ หากไม่เป็นเช่นนั้นให้ใช้กลุ่มที่ไม่จับภาพเพื่อจัดสรรหน่วยความจำเพิ่มเติมสำหรับการคำนวณแทนที่จะจัดเก็บสิ่งที่คุณไม่จำเป็นต้องใช้
?:ภายในกลุ่มหรือที่รู้จักnon-capturingเพียงแค่พูดว่าคุณไม่สามารถใช้การแสดงออกตรงกับ$1, $2และอื่น ๆ ... ^หากคุณต้องการที่แสดงออกไม่ตรงกับสิ่งที่คุณต้องการคือ
(?! ... )insead ซึ่งหมายความว่า(?!s|season)ในกรณีนี้

ภาพด้านบนที่นำมาจากตัวอย่างจริงนี้: https://regex101.com/r/cU5lC2/1
ฉันจะใช้phpsh โต้ตอบเชลล์บนUbuntu 12.10เพื่อสาธิตเอ็นจิ้นPCRE regexผ่านวิธีการที่เรียกว่าpreg_match
เริ่ม phpsh ใส่เนื้อหาบางส่วนลงในตัวแปรจับคู่คำ
el@apollo:~/foo$ phpsh
php> $content1 = 'badger'
php> $content2 = '1234'
php> $content3 = '$%^&'
php> echo preg_match('(\w+)', $content1);
1
php> echo preg_match('(\w+)', $content2);
1
php> echo preg_match('(\w+)', $content3);
0
วิธี preg_match ที่ใช้เครื่องยนต์ PCRE ภายในภาษา PHP ในการวิเคราะห์ตัวแปร$content1, $content2และ$content3ด้วย(\w)+รูปแบบ
$ content1 และ $ content2 มีอย่างน้อยหนึ่งคำ $ content3 ไม่มี
el@apollo:~/foo$ phpsh
php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty gun';
php> $gun4 = 'unicorn gun';
php> echo preg_match('(dart|fart)', $gun1);
1
php> echo preg_match('(dart|fart)', $gun2);
1
php> echo preg_match('(dart|fart)', $gun3);
1
php> echo preg_match('(dart|fart)', $gun4);
0
ตัวแปรgun1และgun2มีสตริงdartหรือfartที่ถูกต้อง แต่ gun3 มีdartyและยังคงตรงกันนั่นคือปัญหา ในตัวอย่างถัดไป
ขอบเขตของคำสามารถจับคู่บังคับ\bได้โปรดดู:

Regex Visual Image ได้มาจากhttp://jex.im/regulexและhttps://github.com/JexCheng/regulex ตัวอย่าง:
el@apollo:~/foo$ phpsh
php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty gun';
php> $gun4 = 'unicorn gun';
php> echo preg_match('(\bdart\b|\bfart\b)', $gun1);
1
php> echo preg_match('(\bdart\b|\bfart\b)', $gun2);
1
php> echo preg_match('(\bdart\b|\bfart\b)', $gun3);
0
php> echo preg_match('(\bdart\b|\bfart\b)', $gun4);
0
การ\bยืนยันว่าเรามีขอบเขตของคำทำให้แน่ใจว่า "โผ" ตรงกัน แต่ "โผ" ไม่ใช่
ฉันทดสอบตัวอย่างใน js ทางออกที่ง่ายที่สุด - เพียงแค่เพิ่มคำที่คุณต้องการภายใน / /:
var reg = /cat/;
reg.test('some cat here');//1 test
true // result
reg.test('acatb');//2 test
true // result
ตอนนี้ถ้าคุณต้องการคำเฉพาะที่มีขอบเขตไม่ใช่ภายในตัวอักษรสัญลักษณ์อื่น ๆ เราใช้เครื่องหมายb :
var reg = /\bcat\b/
reg.test('acatb');//1 test
false // result
reg.test('have cat here');//2 test
true // result
นอกจากนี้เรายังมี exec () method ใน js ซึ่งส่งคืน object-result ช่วยให้ fg รับข้อมูลเกี่ยวกับสถานที่ / ดัชนีของคำของเรา
var matchResult = /\bcat\b/.exec("good cat good");
console.log(matchResult.index); // 5
หากเราต้องการคำที่ตรงกันทั้งหมดในสตริง / ประโยค / ข้อความเราสามารถใช้ตัวปรับแต่ง g (การจับคู่ทั่วโลก):
"cat good cat good cat".match(/\bcat\b/g).length
// 3
ตอนนี้คำสุดท้าย - ฉันไม่ต้องการคำเฉพาะ 1 คำ แต่มีบางคำ เราใช้ | หมายถึงทางเลือก / หรือ
"bad dog bad".match(/\bcat|dog\b/g).length
// 1
[ ]กำหนดคลาสอักขระ ดังนั้นทุกตัวอักษรที่คุณตั้งไว้จะตรงกัน [012]จะจับคู่0หรือ1หรือ2และ[0-2]ทำงานเหมือนกัน
สิ่งที่คุณต้องการคือการจัดกลุ่มเพื่อกำหนดหรือคำสั่ง ใช้(s|season)สำหรับปัญหาของคุณ
Btw คุณต้องระวัง อักขระเมตาในนิพจน์ทั่วไป (หรือภายในการจัดกลุ่ม) แตกต่างจากคลาสอักขระ คลาสอักขระก็เหมือนกับภาษาย่อย [$A]จะจับคู่$หรือAไม่มีอะไรอื่น ไม่มีการหลบหนีที่นี่สำหรับเงินดอลลาร์
(season|s)แทน[season]ตรงกับใด ๆ ของs,e,a, ,on