ติดตั้ง Regex Decider


11

งานของคุณคือการสร้างโปรแกรมที่กำหนดว่าสตริงที่กำหนดเป็นนิพจน์ปกติที่ถูกต้องหรือไม่หรือใช้โค้ดที่มาจากไซต์ในเครือข่าย StackExchange

สำหรับวัตถุประสงค์ของการท้าทายนี้, ()*?|\ภาษาแสดงออกปกติจะปล้นลงและน้อยที่สุดส่วนใหญ่เป็นชุดของตัวละครเมตา: ดังนั้นคุณจะไม่สามารถใช้ตัวแยกวิเคราะห์ regex ในตัวได้

  • \ใช้เพื่อหลบหนีเมตาอักขระ มันจะต้องตามด้วยตัวอักษรเมตา
  • วงเล็บที่ไม่ใช้ค่า Escape จะต้องมีความสมดุล
  • *และ?ต้องนำหน้าด้วยอักขระที่ไม่ใช่เมตาอักขระกลุ่มวงเล็บหรือเมตาอักขระที่ใช้ Escape
  • อักขระ ASCII ที่พิมพ์ได้อื่น ๆ ทั้งหมดรวมถึงการขึ้นบรรทัดใหม่แท็บและพื้นที่ต้องเป็นอักขระที่ไม่ใช่เมตา เกิดอะไรขึ้นกับสตริงที่มีอักขระอื่น ๆ ไม่ได้ถูกกำหนดไว้
  • ความหมายที่แท้จริงของ regex ไม่สำคัญสำหรับความท้าทายนี้

ตัวอย่าง

Truthy:
  abc
  a?
  (a|)*
  ()
  a|b*
  \*
  \\
  \\*
  a*b?(cd|e)
  +
  [
  }
  (123\))*
  \|
  (a(b(c|d)*e)*f)*
  (|\)*)
  (abc)+*
  (abc)+
  +abc

^ last test case is an actual newline

Falsy:
  ?abc
  *
  **
  \
  (
  a*?
  a?*
  ?
  a)
  (\)
  (|\)*
  \()
  |*
  (?:abc)
  \\**
  \n

เกณฑ์การให้คะแนน

คะแนนโดยรวมของคุณคือจำนวนตัวอย่างที่นำมาจากคำถามและคำตอบรอบ ๆ StackExchange

  • ข้อมูลโค้ดซ้ำ ๆ จะถูกนับเป็นจำนวนเท่าที่มีการใช้งาน
  • ช่องว่างสามารถเพิ่มและลบได้อย่างอิสระ (เนื่องจาก Python, Haskell และภาษาที่ไวต่อช่องว่างอื่น ๆ ) และจะไม่นับรวมนับรวมข้อมูลของคุณ
    • ยกเว้นจะเป็นถ้ารหัสของคุณจะถูกเขียนขึ้นจริงในช่องว่าง
  • ตัวอย่างได้รับอนุญาตจากไซต์ StackExchange ใด ๆ ตราบเท่าที่พวกเขามาจากคำถามคำตอบและความคิดเห็นที่เก่ากว่า (รวมถึงการแก้ไขเวลา - ใช้การแก้ไขที่เก่ากว่าถ้าจำเป็น) กว่าความท้าทายนี้ (24 ก.ย. 2019 @ 3:30 PM UTC)
  • ตัวอย่างข้อมูลสามารถมาจากที่ใดก็ได้ในคำถามคำตอบหรือเนื้อหาความคิดเห็นไม่ว่าจะอยู่ในบล็อกโค้ดที่ฟอร์แมตหรือไม่ก็ตาม
  • การตัดตัวอย่างข้อมูลลงในกึ่งกลางอีกสาเหตุทำให้ข้อมูลโค้ดด้านนอกนับเป็นตัวอย่างข้อมูลสองรายการ

คะแนนต่ำสุดชนะ!


1
@RobinRyder ใช่เปลี่ยนแล้ว
Beefster

โพสต์สามารถเก่ากว่าหรือเท่ากับความท้าทายนี้ได้หรือไม่เราสามารถใช้ตัวอย่างจากเนื้อหาของความท้าทายนี้ได้หรือไม่?
Jo King

1
"เช่นนี้คุณจะไม่สามารถใช้ตัวแยกวิเคราะห์ regex ในตัว" นั่นคือมันบอกว่ามันถูกออกแบบมาเพื่อขัดขวางการใช้งานนั้นสำหรับ ya / nay ง่ายหรือว่าเราถูกห้ามจากการใช้ regex ในคำตอบของเรา?
user0721090601

@guifa มันถูกออกแบบมาเพื่อให้คุณไม่สามารถใช้เครื่องมือ regex ของภาษาของคุณและดูว่ามันรวบรวม regex ที่กำหนดหรือไม่ ทุกภาษาที่ฉันรู้จักสนับสนุนเมตาอักขระขนาดใหญ่และกลุ่มการจับภาพพิเศษดังนั้นพวกเขาจะไม่ตรงกับชุดอักขระนี้อย่างถูกต้องในทุกกรณี
Beefster

1
@ JL2210 นั่นจะทำให้เป็นสองตัวอย่าง: หนึ่งสำหรับการเริ่มต้นและหนึ่งสำหรับการสิ้นสุด คุณสามารถใช้ตัวอย่างข้อมูลเดียวตราบเท่าที่ผ่านการทดสอบทั้งหมดและมาจากคำตอบ / คำถาม / โพสต์ที่เก่ากว่าการท้าทายนี้
Beefster

คำตอบ:


6

Perl 6 , 20 ตัวอย่าง

{$_ eq m/[[<-[()*?|\\]>|\\<[()*?|\\]>|'(' <~~>* ')']<[*?]>?|\|]+/}

ลองออนไลน์!

ตัวอย่างนำมาจาก:

{$_ eq, m/[, <-[, ()*?,|\\ , ]>, |\\, <[, ()*?, |\\, ]>, |, '(' <~~>* ')', <[, *?, ]>, ?|, \|, ,]+/}

นี่เป็นวิธีที่โลภมาก (ทำให้ชัดเจนโดยตัวอย่างอักขระหนึ่งหรือสองตัว) ฉันใช้SymbolHoundเพื่อค้นหาอักขระแต่ละตัวและการเพิ่มประสิทธิภาพที่แท้จริงเพียงอย่างเดียวคือ'(' <~~>* ')'ตัวอย่างข้อมูลซึ่งนำมาจากคำตอบของฉันเองเกี่ยวกับ recursive Perl 6 regexes

คำอธิบาย:

โดยทั่วไปจะตรวจสอบว่าอินพุตเท่ากับการจับคู่โลภของ regex ที่ถูกต้องหรือไม่ เหตุผลที่เราไม่สามารถใช้ regex เองและเพิ่ม^$เพื่อทำเครื่องหมายจุดสิ้นสุดได้เนื่องจากเรากำลังใช้ regex แบบเรียกซ้ำซึ่งจะไม่ทำงานหากมี^$เครื่องหมาย Regex นั้นคือ:

m/[                             ]+/   # Match one or more times
   [              ]  # Any of 
    <-[()*?|\\]> |     # Not a metacharacter
    \\<[()*?|\\]>      # A metacharacter preceded by a \
    '(' <~~>* ')'      # Brackets surrounding a valid regex
                   <[*?]>?  # Optionally followed by a ? or *
                           | \|    # Or just the | metacharacter

TIL ~~ขอบคุณ!
user0721090601

@guifa ใช่ฉันได้เรียนรู้ผ่าน ข้อกำหนดของ P6ซึ่งมีหลายสิ่งหลายอย่างที่ยังไม่ได้บันทึกอย่างถูกต้อง ฉันสงสัย~~ว่าไม่ได้ปรากฏเพราะยังไม่ได้ใช้งานอย่างสมบูรณ์ (เช่น<~~0>) แม้ว่าจะมีอัญมณีอื่นซ่อนอยู่
Jo King
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.