นิพจน์ทั่วไปเพื่อจับคู่คำหรือคำนำหน้า


120

ฉันต้องการจับคู่นิพจน์ทั่วไปกับทั้งคำ

ในตัวอย่างต่อไปนี้ผมกำลังพยายามที่จะตรงsหรือseasonแต่สิ่งที่ฉันมีแมตช์s, e, a, และ on

[s|season]

ฉันจะสร้างนิพจน์ทั่วไปเพื่อจับคู่ทั้งคำได้อย่างไร


4
ใช้(season|s)แทน [season]ตรงกับใด ๆ ของs, e, a, ,o n
falsetru

คำตอบ:


137

วงเล็บมีความหมายสำหรับตัวละครคลาสและคุณจริงพยายามที่จะตรงกับคนใดคนหนึ่งของ: s, |, s(อีกครั้ง) e, a, s(อีกครั้ง) และon

ใช้วงเล็บแทนการจัดกลุ่ม:

(s|season)

หรือกลุ่มที่ไม่จับภาพ:

(?:s|season)

หมายเหตุ: กลุ่มที่ไม่จับภาพจะบอกเครื่องยนต์ว่าไม่จำเป็นต้องจัดเก็บการจับคู่ในขณะที่อีกกลุ่มหนึ่ง (จับภาพกลุ่ม) สำหรับงานเล็ก ๆ ทั้งงานสำหรับงานหนักคุณอาจต้องการดูก่อนว่าคุณต้องการสิ่งที่ตรงกันหรือไม่ หากไม่เป็นเช่นนั้นให้ใช้กลุ่มที่ไม่จับภาพเพื่อจัดสรรหน่วยความจำเพิ่มเติมสำหรับการคำนวณแทนที่จะจัดเก็บสิ่งที่คุณไม่จำเป็นต้องใช้


ใช่ฉันได้ตระหนักแล้ว การไม่จับภาพคือสิ่งที่ฉันต้องการ ฉันคิดว่าการใช้ () จะตรงกันเสมอเพราะรู้ว่ามีตัวเลือกที่ไม่ตรงกันนั้นสะดวกขอบคุณ
NMGod

คุณเข้าใจผิดว่า ?:ภายในกลุ่มหรือที่รู้จักnon-capturingเพียงแค่พูดว่าคุณไม่สามารถใช้การแสดงออกตรงกับ$1, $2และอื่น ๆ ... ^หากคุณต้องการที่แสดงออกไม่ตรงกับสิ่งที่คุณต้องการคือ
EverythingRightPlace

@ NMGodA1b2c3d4 ยินดีต้อนรับ! คุณหมายถึงตัวเลือกที่จะไม่จับคู่หรือจับคู่ (มีความแตกต่างใช่) หากคุณไม่ต้องการจับคู่สิ่งเหล่านี้คุณจะใช้(?! ... )insead ซึ่งหมายความว่า(?!s|season)ในกรณีนี้
Jerry

127

ใช้ตัวอย่างออนไลน์สดนี้เพื่อทดสอบรูปแบบของคุณ:

ใส่คำอธิบายภาพที่นี่

ภาพด้านบนที่นำมาจากตัวอย่างจริงนี้: 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ได้โปรดดู: การวิเคราะห์ภาพว่า wordboundary กำลังทำอะไรจาก jex.im/regulex

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ยืนยันว่าเรามีขอบเขตของคำทำให้แน่ใจว่า "โผ" ตรงกัน แต่ "โผ" ไม่ใช่


3
โหวตเพิ่มเพราะฉันต้องการ \ b ถ่าน แต่ไม่รู้!
Nieminen

เหตุใดคำอธิบายนี้จึงไม่เป็นคำตอบ
dewwwald

1
เนื่องจากผู้ที่โพสต์คำถามเลือกคำตอบแรกที่เข้ามาและไม่ต้องกังวลที่จะเปลี่ยนเป็นของฉันเมื่อคำตอบที่เหนือกว่าของฉันเข้ามาในภายหลัง คุณสามารถถามผู้ถามผ่านทางความคิดเห็นใต้คำถามเพื่อเปลี่ยนการเลือกคำตอบของพวกเขาเป็นคำถามนี้และจะช่วยเพิ่มคุณค่าของหน้านี้สำหรับผู้ที่เข้ามาดู
Eric Leschinski

1
ฉันโหวตให้เพราะคุณใช้คำว่า "ผายลม" ในตัวอย่างของคุณ ... และฉันต้องการ \ w +;)
SomethingOn

ฉันใช้regexr.com
Applez00800

4

ฉันทดสอบตัวอย่างใน 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

2

[ ]กำหนดคลาสอักขระ ดังนั้นทุกตัวอักษรที่คุณตั้งไว้จะตรงกัน [012]จะจับคู่0หรือ1หรือ2และ[0-2]ทำงานเหมือนกัน

สิ่งที่คุณต้องการคือการจัดกลุ่มเพื่อกำหนดหรือคำสั่ง ใช้(s|season)สำหรับปัญหาของคุณ

Btw คุณต้องระวัง อักขระเมตาในนิพจน์ทั่วไป (หรือภายในการจัดกลุ่ม) แตกต่างจากคลาสอักขระ คลาสอักขระก็เหมือนกับภาษาย่อย [$A]จะจับคู่$หรือAไม่มีอะไรอื่น ไม่มีการหลบหนีที่นี่สำหรับเงินดอลลาร์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.