รสชาติ PCRE, 261 289 210 184 127 109 71 53 51 44 40 ไบต์
ใช่มันเป็นไปได้!
<^<()(?R){2}>\z|\1\Q^<()(?R){2}>\z|\1\Q>
ลองที่นี่ (แต่/
แสดงให้เห็นว่าเป็นตัวคั่นบน Regex101)
โปรดอย่าทำการแก้ไข (อัปเดต) ที่ไม่จำเป็นในหน้า Regex101 หากการแก้ไขของคุณไม่จริงเกี่ยวข้องกับการปรับปรุงหรือพยายามทดสอบ regex นี้คุณสามารถแยกหรือสร้างใหม่จากหน้าแรกของพวกเขา
รุ่นนี้ทำงานอย่างถูกต้องมากขึ้นใน Regex101 (44 ไบต์):
/^\/()(?R){2}\/\z|\1\Q^\/()(?R){2}\/\z|\1\Q/
ลองที่นี่
นี่ง่ายกว่ารุ่นดั้งเดิมมากและทำงานได้เหมือนควินดั้งเดิม มันพยายามกำหนดสตริงโดยไม่ใช้มันและใช้มันในที่อื่น ดังนั้นจึงสามารถวางไว้ใกล้กับปลายด้านหนึ่งของ regex เพื่อลดจำนวนอักขระที่ต้องใช้อักขระเพิ่มเพื่อกำหนดรูปแบบการจับคู่และทำซ้ำอีกครั้ง
คำอธิบาย:
\Q^\/()(?R){2}\/\z|\1\Q
^\/()(?R){2}\/\z|\1\Q
ตรงกับสตริง นี้ใช้มุมแหลมที่\Q...\E
ไม่ต้องมีการปิดและตัวคั่นใช้ Escape \Q
ทำงานใน สิ่งนี้ทำให้บางเวอร์ชันก่อนหน้านี้ใช้งานได้กับ Regex101 เท่านั้นและไม่ใช่ในเครื่อง แต่โชคดีที่เวอร์ชันล่าสุดใช้งานได้และฉันก็เพิ่มจำนวนไบต์อีกด้วย
\1
ก่อนการ\Q
จับคู่กลุ่มที่ถูกจับภาพ 1 เนื่องจากกลุ่มที่ 1 ไม่มีอยู่ในตัวเลือกนี้จึงสามารถจับคู่ในการโทรซ้ำ ในการโทรซ้ำจะจับคู่สตริงว่าง
(?R){2}
เรียก regex ทั้งหมดซ้ำสองครั้งซึ่งตรงกับ^\/()(?R){2}\/\z|\1\Q
แต่ละครั้ง
()
ไม่ทำอะไรนอกจากจับสตริงว่างลงในกลุ่ม 1 ซึ่งเปิดใช้งานตัวเลือกอื่นในการโทรซ้ำ
^\/()(?R){2}\/\z
จับคู่(?R){2}
กับตัวคั่นเพิ่มตั้งแต่ต้นจนจบ \/
ก่อนที่จะโทรเรียกซ้ำยังทำให้แน่ใจว่าตัวเลือกนี้ตัวเองไม่ตรงกับในการเรียก recursive เพราะมันจะไม่เป็นที่จุดเริ่มต้นของสตริง
51 ไบต์เมื่อปิด\Q...\E
:
/\QE\1|^\/(\\)Q(?R){2}z\/\E\1|^\/(\\)Q(?R){2}z\/\z/
ลองที่นี่
รุ่นดั้งเดิม 188 ไบต์
ขอบคุณ Martin Büttnerสำหรับการตีกอล์ฟออกไปประมาณ 100 ไบต์!
/^(?=.{173}\Q\2\)){2}.{11}$\E\/\z)((?=(.2.|))\2\/\2\^\2\(\2\?=\2\.\2\{173}\2\\Q\2\\2\2\\\2\)\2\)\2\{2}\2\.\2\{11}\2\$\2\\E\2\\\2\/\2\\z\2\)\2\(\2\(\2\?=\2\(\2\.2\2\.\2\|\2\)\2\)){2}.{11}$/
ลองที่นี่
หรือ 210 ไบต์โดยไม่ต้อง\Q...\E
:
/^(?=.{194}\\2\\.\)\{2}\.\{12}\$\/D$)((?=(.2.|))\2\/\2\^\2\(\2\?=\2\.\2\{194}\2\\\2\\2\2\\\2\\\2\.\2\\\2\)\2\\\2\{2}\2\\\2\.\2\\\2\{12}\2\\\2\$\2\\\2\/D\2\$\2\)\2\(\2\(\2\?=\2\(\2\.2\2\.\2\|\2\)\2\)){2}.{12}$/D
ลองที่นี่
รุ่นขยาย:
/^(?=.{173}\Q\2\)){2}.{11}$\E\/\z) # Match things near the end.
((?=(.2.|)) # Capture an empty string or \2\ into group 2.
\2\/\2\^\2\(\2\?=\2\.\2\{173}\2\\Q\2\\2\2\\\2\)\2\)\2\{2}\2\.
\2\{11}\2\$\2\\E\2\\\2\/\2\\z\2\) # 1st line escaped.
\2\(\2\(\2\?=\2\(\2\.2\2\.\2\|\2\)\2\) # 2nd line escaped.
){2}
.{11}$/x
ส่วนขยายที่ชอบ(?=
และ\1
ทำให้นิพจน์ "ปกติ" ที่เรียกว่าไม่เป็นแบบปกติอีกต่อไปซึ่งทำให้เป็นไปได้ด้วย การอ้างอิงกลับไม่ปกติ แต่ lookahead คือ
คำอธิบาย:
- ฉันใช้
\2\
แทน\
ตัวละครพิเศษเพื่อหลบหนี หาก\2
ตรงกับสตริงว่าง\2\x
(ซึ่งx
เป็นอักขระพิเศษ) ตรงกับx
ตัวเอง หาก\2
การแข่งขัน\2\
, \2\x
ตรงกับหนึ่งหนี \2
ในการจับคู่สองกลุ่ม 1 อาจแตกต่างกันใน regex ในครั้งแรกที่ควรจะตรงกับสตริงที่ว่างเปล่าและครั้งที่สอง\2
\2\
\Q\2\)){2}.{11}$\E\/\z
(บรรทัดที่ 1) ตรงกับ 15 ตัวอักษรจากท้ายที่สุด และ.{11}$
(บรรทัด 7) จับคู่ 11 ตัวอักษรจากท้าย (หรือก่อนขึ้นบรรทัดใหม่ต่อท้าย) ดังนั้นรูปแบบก่อนที่รูปแบบที่สองจะต้องตรงกับครั้งแรก 4 หรือ 3 ตัวอักษรในรูปแบบแรกดังนั้น\2\.\2\|\2\)\2\)
จะต้องตรงกับหรือ...\2\)
ไม่สามารถมีอักขระขึ้นบรรทัดใหม่เพราะตัวอักษรตัวสุดท้ายที่ควรจะเป็น...\2\
)
และข้อความที่ตรงกันไม่ได้มีอีก)
ก่อนที่ขวาสุดหนึ่งดังนั้นตัวละครอื่น ๆ \2
ทั้งหมดจะต้องอยู่ใน \2
ถูกกำหนดเป็น(.2.|)
ดังนั้นจึงสามารถเป็น\2\
ได้
- บรรทัดแรกทำให้การแสดงออกทั้งหมดตรงกับตัวละคร 188 ตัวเนื่องจากทุกอย่างมีความยาวคงที่ สองเท่าของกลุ่มที่ 1 ตรงกับ 45 * 2 ตัวอักษรบวก 29
\2
ครั้ง และสิ่งต่าง ๆ หลังจากกลุ่มที่ 1 ตรงกับ 11 ตัวอักษร ดังนั้นความยาวทั้งหมดของสองครั้ง\2
จะต้องเท่ากับ 3 ตัวอักษร การรู้ว่า\2
ครั้งที่สองมีความยาว 3 ตัวอักษรจะต้องว่างเปล่าเป็นครั้งแรก
- ทุกอย่างยกเว้น lookahead และ
\2
เป็นตัวอักษรในกลุ่ม 1 ด้วยสองครั้งที่\2
รู้จักและตัวละครสองสามตัวสุดท้ายที่รู้จักจากบรรทัดแรก regex นี้ตรงกับหนึ่งสตริง
- Martin Büttnerเกิดขึ้นกับแนวคิดของการใช้ lookahead เพื่อจับภาพกลุ่ม 2 และทำให้มันทับซ้อนกับส่วน quine นี่เป็นการลบตัวละครที่ไม่หนีไปตามปกติระหว่างสองครั้งของกลุ่มที่ 1 และช่วยหลีกเลี่ยงรูปแบบที่จะจับคู่พวกเขาในเวอร์ชั่นดั้งเดิมของฉันและทำให้ regex ง่ายขึ้นมาก
Regex ที่ไม่มีการเรียกซ้ำหรือการอ้างอิงย้อนกลับ 85 ไบต์
บางคนอาจโต้แย้งว่านิพจน์ที่มีการเรียกซ้ำหรือการอ้างอิงซ้ำไม่ใช่นิพจน์ "ปกติ" ที่แท้จริง แต่นิพจน์ที่มี lookahead เท่านั้นยังคงสามารถจับคู่ภาษาปกติได้แม้ว่าพวกเขาอาจจะนานกว่านั้นหากแสดงออกด้วยการแสดงออกปกติแบบดั้งเดิม
/(?=.*(\QE\\){2}z\/\z)^\/\(\?\=\.\*\(\\Q.{76}\E\\){2}z\/\z)^\/\(\?\=\.\*\(\\Q.{76}\z/
ลองที่นี่
610 ไบต์โดยไม่มี\Q...\E
(ที่จะกอล์ฟ):
/^(?=.{610}$)(?=.{71}(\(\.\{8\}\)\?\\.[^(]*){57}\)\{2\}\.\{12\}\$\/D$)((.{8})?\/(.{8})?\^(.{8})?\((.{8})?\?=(.{8})?\.(.{8})?\{610(.{8})?\}(.{8})?\$(.{8})?\)(.{8})?\((.{8})?\?=(.{8})?\.(.{8})?\{71(.{8})?\}(.{8})?\((.{8})?\\(.{8})?\((.{8})?\\(.{8})?\.(.{8})?\\(.{8})?\{8(.{8})?\\(.{8})?\}(.{8})?\\(.{8})?\)(.{8})?\\(.{8})?\?(.{8})?\\(.{8})?\\(.{8})?\.(.{8})?\[(.{8})?\^(.{8})?\((.{8})?\](.{8})?\*(.{8})?\)(.{8})?\{57(.{8})?\}(.{8})?\\(.{8})?\)(.{8})?\\(.{8})?\{2(.{8})?\\(.{8})?\}(.{8})?\\(.{8})?\.(.{8})?\\(.{8})?\{12(.{8})?\\(.{8})?\}(.{8})?\\(.{8})?\$(.{8})?\\(.{8})?\/D(.{8})?\$(.{8})?\)(.{8})?\(){2}.{12}$/D
ลองที่นี่
ความคิดคล้ายกัน
/^(?=.{610}$)(?=.{71}(\(\.\{8\}\)\?\\.[^(]*){57}\)\{2\}\.\{12\}\$\/D$)
((.{8})?\/(.{8})?\^(.{8})?\((.{8})?\?=(.{8})?\.(.{8})?\{610(.{8})?\}(.{8})?\$(.{8})?\)
(.{8})?\((.{8})?\?=(.{8})?\.(.{8})?\{71(.{8})?\}
(.{8})?\((.{8})?\\(.{8})?\((.{8})?\\(.{8})?\.(.{8})?\\(.{8})?\{8(.{8})?\\(.{8})?\}
(.{8})?\\(.{8})?\)(.{8})?\\(.{8})?\?(.{8})?\\(.{8})?\\
(.{8})?\.(.{8})?\[(.{8})?\^(.{8})?\((.{8})?\](.{8})?\*(.{8})?\)(.{8})?\{57(.{8})?\}
(.{8})?\\(.{8})?\)(.{8})?\\(.{8})?\{2(.{8})?\\(.{8})?\}
(.{8})?\\(.{8})?\.(.{8})?\\(.{8})?\{12(.{8})?\\(.{8})?\}
(.{8})?\\(.{8})?\$(.{8})?\\(.{8})?\/D(.{8})?\$(.{8})?\)(.{8})?\(){2}.{12}$/D
การแสดงออกปกติขั้นพื้นฐาน
ถ้าไม่อนุญาต lookahead สิ่งที่ฉันทำได้ตอนนี้คือ:
/\\(\\\(\\\\){2}/
ซึ่งตรงกับ
\\(\\\(\\
หาก{m,n}
ไม่ได้รับอนุญาตให้ใช้ปริมาณมันเป็นไปไม่ได้เพราะไม่มีสิ่งใดที่สามารถจับคู่หนึ่งสตริงเท่านั้นสามารถจับคู่สตริงได้นานกว่าตัวมันเอง แน่นอนว่าเรายังคงสามารถประดิษฐ์สิ่งที่เหมือนกัน\q
ซึ่งตรงกับเท่านั้น/\q/
และยังคงพูดถึงนิพจน์ทั่วไป แต่ดูเหมือนไม่มีอะไรเช่นนี้ได้รับการสนับสนุนโดยการใช้งานที่สำคัญ