ฉันต้องการจับคู่นิพจน์ทั่วไปกับทั้งคำ
ในตัวอย่างต่อไปนี้ผมกำลังพยายามที่จะตรงs
หรือseason
แต่สิ่งที่ฉันมีแมตช์s
, e
, a
, และ o
n
[s|season]
ฉันจะสร้างนิพจน์ทั่วไปเพื่อจับคู่ทั้งคำได้อย่างไร
ฉันต้องการจับคู่นิพจน์ทั่วไปกับทั้งคำ
ในตัวอย่างต่อไปนี้ผมกำลังพยายามที่จะตรงs
หรือseason
แต่สิ่งที่ฉันมีแมตช์s
, e
, a
, และ o
n
[s|season]
ฉันจะสร้างนิพจน์ทั่วไปเพื่อจับคู่ทั้งคำได้อย่างไร
คำตอบ:
วงเล็บมีความหมายสำหรับตัวละครคลาสและคุณจริงพยายามที่จะตรงกับคนใดคนหนึ่งของ: s
, |
, s
(อีกครั้ง) e
, a
, s
(อีกครั้ง) และo
n
ใช้วงเล็บแทนการจัดกลุ่ม:
(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
, ,o
n