นิพจน์ทั่วไปที่จับคู่ข้ามกัน


21

งานของคุณที่นี่คือการเขียนนิพจน์ทั่วไปสองนิพจน์ซึ่งแต่ละรายการจะตรงกับอีกนิพจน์ แต่ไม่ตรงกับตัวเอง

ทั้งนิพจน์ทั่วไปควรมีแบบฟอร์มนี้:

/pattern/optional-flags

นี่เป็นรูปแบบที่ควรจับคู่

ทางออกที่สั้นที่สุดชนะ ความยาวโซลูชันจะนับเป็นผลรวมของอักขระในนิพจน์ทั่วไปรวมทั้งเครื่องหมายทับและแฟล็ก

ใช้มาตรฐานไวยากรณ์ regex ที่คุณเลือกหรือระบุภาษาการเขียนโปรแกรมเมื่อสร้างความแตกต่าง

มีความสุข!


regex ต้องตรงกับเครื่องหมายสแลชและแฟล็กของ regex อื่นหรือไม่
ProgramFOX

@ProgramFOX ใช่ฉันเพิ่มบรรทัดเพื่อให้ชัดเจน
GOTO 0

คุณสามารถกำหนดการแข่งขันได้หรือไม่? นั่นคือการ/a/แข่งขันregex abc?
The Guy with The Hat

2
@TheGuywithTheHat ดีฉันคิดอย่างนั้นถ้าคุณเลือกภาษาที่กำหนดข้อ จำกัด บางอย่างเช่นความต้องการที่จะตรงกับสตริงทั้งหมด นี่เป็นข้อกังวลของคุณหรือไม่?
GOTO 0

1
เพื่อความชัดเจน: ฉันคิดว่าไม่อนุญาตให้ใช้ตัวคั่นอื่น (ตามที่ได้รับอนุญาตจากเช่น PHP PCRE) (IE ไม่มีการส่ง/^%/และ%^/%)
ปีเตอร์เทย์เลอร์

คำตอบ:


7

PRCE พร้อมตัวปรับ A: 9 ตัวอักษร

/A$/
/.A/A

แม้ว่านี่จะเป็นตัวแปรใน/modifier$/คำตอบของ Doorknob แต่ฉันคิดว่านวัตกรรมนี้มีคุณสมบัติเป็นคำตอบที่แยกต่างหากแทนที่จะแสดงความคิดเห็นเกี่ยวกับเขา: ตัวดัดแปลงทำหน้าที่สองหน้าที่ แทนที่จะอยู่ที่นั่นเพียงเพื่อให้ regex อื่นจับคู่เท่านั้น

regex แรกตรงกับสายใด ๆ Aที่ลงท้ายด้วยตัวอักษร regex ที่สองจับคู่สตริงใด ๆ ที่มีอักขระตัวที่สองเป็นตัวอักษรAโดยใช้แฟล็ก anchor-to-start

การสาธิตออนไลน์


3
ในการเอาชนะสิ่งนี้ต้องใช้ตัวอักษรที่ไม่ใช่ตัวคั่นสี่ตัวเท่านั้นและเนื่องจากการ//จับคู่สิ่งใด ๆ ซึ่งหมายความว่าแต่ละ regexes สามารถมีได้ไม่เกินสามตัวอักษร การใช้ PHP PCRE มี 73339 regexes ที่ไม่จับคู่ตัวเองภายในข้อ จำกัด และการตรวจสอบอย่างละเอียดของคู่ที่มีความยาวน้อยกว่า 10 (ตามคำสั่งของ 32Mpairs มากกว่า 5.7Gpairs เพราะส่วนใหญ่เป็น 5 chars รวมถึงตัวคั่น) ทางออกนี้และไม่มีคนอื่น ฉันจึงอ้างว่ามันเป็นสิ่งที่ดีที่สุดสำหรับโปรแกรม regex นั้น
Peter Taylor

18

4 + 6 = คะแนน 10

regex แรก:

/i$/

regex ที่สอง:

/^.i/i

ไชโยสำหรับการละเมิดธง! :-P

คนแรกที่ตรงกับสิ่งที่ลงท้ายด้วยi(ดังนั้น regex ใด ๆ กับiธง)

iคนที่สองที่ตรงกับสิ่งที่มีตัวละครที่สองของ

เลือกรุ่น: และ/i$/g/g$/i


3
อีกรูปแบบหนึ่งจะเป็น/x.$/และ/^.x/กลุ่ม x
shiona

หรือ/i$/และ/\/$/i
Peter Taylor

หรือ/i$/และ/i\$/i
Peter Taylor

6

JavaScript regexes คะแนน: 18

regex แรก:

/^[^a]+$/

regex ที่สอง:

/^[^b]+$/

ทดสอบ JavaScript:

var regex1 = "/^[^a]+$/";
var regex2 = "/^[^b]+$/";
alert(/^[^a]+$/.test(regex2)); // true: regex1 matches regex2
alert(/^[^b]+$/.test(regex1)); // true: regex2 matches regex1
alert(/^[^a]+$/.test(regex1)); // false: regex1 doesn't match regex1
alert(/^[^b]+$/.test(regex2)); // false: regex2 doesn't match regex2

ทดสอบออนไลน์: http://jsfiddle.net/99Sx6/



5

4 + 6 = 10

regex แรก:

/i$/

regex ที่สอง:

/\/$/i

i$จับคู่สิ่งที่ลงท้ายด้วยiอันที่สอง /$จับคู่สิ่งที่ลงท้ายด้วย/อันแรก


2
ความคิดเห็นที่ซ้ำกันฉันโพสต์ไปยังคำตอบของ Doorknob
Peter Taylor

@PeterTaylor ไม่ได้สังเกตเห็นความคิดเห็นจนกระทั่งตอนนี้ สิ่งเหล่านี้เป็นการค้นพบอิสระ
Justin

ใช่ฉันค้นพบเวอร์ชันของ shiona ด้วยเหมือนกัน
Peter Taylor

3

5 + 5 = 10

Regex # 1:

/0.$/

Regex # 2:

/^.0/

0ในทั้ง regexes สามารถถูกแทนที่ด้วยใด ๆ ที่ไม่ใช่ metacharacter และ regex ยังคงทำงาน

0.$ตรงกับสิ่งที่มีวินาทีสุดท้ายตัวละคร0และตรงกับสิ่งที่มีตัวละครที่สองคือ^.00


2
คู่แรกไม่ใช่ regexes ที่ถูกต้อง: คุณต้องหนีจาก/es อีกทางเลือกหนึ่งคือคำตอบของ Doorknob
Peter Taylor

2

JavaScript regexes คะแนน: 13

regex แรก:

/\d/

regex ที่สอง:

/^[^0]+$/

คำอธิบาย: regex แรกตรงกับทุกอย่างที่มีตัวเลขและ regex ที่สองตรงกับทุกอย่างที่ไม่มี 0สองตรงกับทุกอย่างที่ไม่ได้มี

ทดสอบ JavaScript:

var regex1 = "/\d/";
var regex2 = "/^[^0]+$/";
alert(/\d/.test(regex2)); // true: regex1 matches regex2
alert(/^[^0]+$/.test(regex1)); // true: regex2 matches regex1
alert(/\d/.test(regex1)); // false: regex1 doesn't match regex1
alert(/^[^0]+$/.test(regex2)); // false: regex2 doesn't math regex2

ทดสอบออนไลน์: http://jsfiddle.net/5VYjC/1/



2

คะแนน: 5 + 5 = 10

เอาฉันไปครึ่งชั่วโมงเพื่อหา แต่ฉันมีความสุขจริงๆที่ฉันได้ :)

ที่ 1 คือ: /j.$/

ที่สองคือ: /^.j/

อันดับที่ 1 ตรงกับสิ่งที่jเกิดขึ้นในตำแหน่งที่สองเริ่มต้นจากด้านขวา อันดับสองตรงกับสิ่งที่jเกิดขึ้นที่ตำแหน่งที่สองเริ่มต้นจากซ้าย

ฉันยังไม่ได้ทดสอบ แต่ฉันคิดว่า RegExs เหล่านี้มีความหลากหลายจริงๆเพราะjสามารถถูกแทนที่ด้วย\wตัวละครใด ๆ(หรือมากกว่านั้น) และยังคงทำงานได้ดี

ป.ล. นี้ควร (หวังว่า) ทำงานในภาษาใด ๆ แม้ว่าถ้ามันไม่ทำงานในใด ๆ โปรดแจ้งในความคิดเห็นด้านล่าง :)

ทดสอบ


และตอนนี้ฉันก็ทราบแล้วว่า @Quiccunx ได้โพสต์เวอร์ชันเดียวกันกับของฉันแล้ว ฉันขอโทษ Quiccunx จริง ๆ และถ้ามันจะโปรดใด ๆ ฉันจะลบคำตอบของฉัน
Gaurang Tandon

1

PCRE โดยใช้ตัวแก้ไข x: 11 ตัวอักษร

/\s/
/ s.$/x

รายการแรกตรงกับสตริงใด ๆ ที่มีอักขระช่องว่าง แต่ไม่มีช่องว่าง อันที่สองมีช่องว่าง แต่ถูกละเว้นเนื่องจากxตัวแก้ไข มันตรงกับสายใด ๆ sที่มีตัวอักษรสุดท้ายคือ

PCRE และเอ็นจิ้นอื่น ๆ ที่ใช้คลาสอักขระ: 11 ตัวอักษร

/\w+w/
/\Ww/

ครั้งแรกที่ตรงกับสายใด ๆ กับ "คำว่า" ตัวอักษร (ตัวอักษรหลักขีด) ตามด้วยตัวอักษรw; แมตช์ที่สองสตริงใด ๆ wกับตัวละครที่ไม่ใช่คำตามด้วยตัวอักษร

PCRE และเอ็นจิ้นอื่น ๆ ที่ใช้คลาสของตัวละครและตัวยึดคำศัพท์: 11 ตัวอักษร

/\w\w/
/\bw/

ตัวแรกจะจับคู่สตริงใด ๆ ที่มีอักขระ "คำ" ติดต่อกันสองตัว ที่สองสตริงใด ๆ wกับตัวละครที่ไม่ใช่คำหรือเริ่มต้นของสตริงตามด้วยตัวอักษร


-1

ECMAScript (11 ไบต์):

/^\1?d/
/\d/

เอ็นจิ้น REGEXP อื่น ๆ (14 ไบต์):

/^\\\\1?d/
/\d/

นัดที่ 1 \ d [.. ] หรือ \ 1d [.. ]

ที่สองตรงกับสายใด ๆ ที่มีตัวเลข

แก้ไข:

แต่เดิมคำตอบนี้ถูกโพสต์ว่าเข้ากันได้กับเครื่องยนต์ทั้งหมด แต่ได้รับการพิสูจน์แล้วว่าผิด

มีปัญหากับการอ้างอิงถึงกลุ่มการดักจับ (ตัวอย่างเช่นใน php)


เอนจิ้นของ regex จำนวนมากใช้ regex โดยไม่มีเครื่องหมายทับโดยรอบ แต่คำถามค่อนข้างชัดเจนในการกำหนดให้นับ
Peter Taylor

ฉันไม่นับเป็นคำตอบ ขอเพิ่มบันทึกสำหรับสิ่งนั้น
Ismael Miguel

1
@PeterTaylor ฉันเพิ่มบันทึกย่อ รุ่น Apache มีเพียงเพราะ
Ismael Miguel

Hang on: ในอันแรกเอ็นจิ้นวิเคราะห์คำใดที่\1ไม่ตีความว่าเป็นการอ้างอิงย้อนกลับ
Peter Taylor

ขึ้นอยู่กับวิธีการใช้งานของคุณ ตัวอย่างเช่นใน php ถ้าคุณใส่เข้าไปข้างใน"/^\1?d/"คุณจะมีปัญหา แต่ถ้าคุณทำ'/^\1?d/'มันก็โอเค เครื่องหมายคำพูดสร้างความแตกต่างอย่างมากเมื่อแปลรหัส
Ismael Miguel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.