RegEx-golf: จับคู่เนื้อหาทั้งหมดในสตริง


10

งานของคุณคือเขียน RegEx ที่ตรงกับทุกอย่างภายในสตริง

สตริงที่ถูกกำหนดให้เป็นทุกอย่างที่ล้อมรอบไปด้วย ( แต่ไม่รวม) "สองใช้ Escape

"สามารถหนีออกมาโดย\ที่ยังสามารถหนีออกมาอีกครั้ง

Testcases

string:  ab\c"defg\\\"hi"jkl"mn\\\\"opqrst""
matches:      ^^^^^^^^^^     ^^^^^^        ^ (the empty string)

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

ทางออกที่สั้นที่สุดชนะ

รายละเอียด

  • โปรดระบุรสชาติที่ใช้
  • "การป้อนข้อมูลจะมีความสมดุล
  • จะไม่มี\สิ่งนั้นนำหน้าสตริงเริ่มต้น - ตัวคั่นทันที ตัวอย่างเช่นคุณไม่จำเป็นต้องจัดการabc\"def"

1
จะมี\ก่อนสตริงหรือไม่? abc\"def"เช่น
jimmy23013

ควรจับคู่แต่ละสตริงในหนึ่งกลุ่มหรือไม่ ตัวอย่างเช่นผมสามารถเขียนสิ่งที่มีสองแมตช์ในabc"de"หนึ่งdและอื่น ๆ คือe?
jimmy23013

มันได้รับอนุญาต
Leun Nun

จะมีสตริงว่างหรือไม่
Martin Ender

ใช่จะมีสตริงว่าง
Leun Nun

คำตอบ:


3

PCRE, 21 20 15 19 ไบต์

(.|^)"\K(\\.|[^"])*

ลองที่นี่

สิ่งนี้จับคู่อักขระ (หรือจุดเริ่มต้นของอินพุต) ก่อนเครื่องหมายอัญประกาศเริ่มต้นแล้วรีเซ็ตการจับคู่เพื่อให้แน่ใจว่าเครื่องหมายคำพูดคู่จะไม่ถูกแชร์กับคู่อื่น

PCRE, 25 23 ไบต์

ขอบคุณ Martin Büttnerสำหรับการเล่นกอล์ฟขนาด 2 ไบท์

(\\.|[^"])*+(?!"(?R)|$)

ลองที่นี่

คำอธิบาย

(
    \\.|[^"]     # An escaped character, or a character that isn't a double quote
)*+              # Possessive zero-or-more quantifier, which means backtracking
                 # could not happen after first match is found. That means if \\.
                 # matched, it would never switch to [^"], because it is always a
                 # match if it just stopped after the \\. without backtracking.
(?!"(?R)|$)      # Make sure it is not followed by a double quote and another
                 # match, or the end of the input.

โปรดทราบว่า quantifier ที่เป็นเจ้าของ ( *+) ทำให้แน่ใจว่า lookahead เชิงลบเริ่มต้นเสมอหลังจากสตริงทั้งหมดหรือทั้งเซ็กเมนต์ของสตริงที่ไม่ใช่

มี 4 กรณี:

  • การแข่งขันเริ่มต้นที่ใดก็ได้นอกสตริง \\.จะไม่ตรงกับเครื่องหมายคำพูดคู่ตามการชี้แจง มันสามารถจบก่อนเครื่องหมายคำพูดคู่ถัดไปซึ่งเริ่มต้นสตริงหรือสิ้นสุดอินพุตเท่านั้น ทั้งสองกรณีล้มเหลวในการมองเชิงลบ
  • การแข่งขันเริ่มต้นที่จุดเริ่มต้นของสตริง (\\.|[^"])*+จะจับคู่สตริงที่สมบูรณ์ อักขระต่อไปต้องเป็นเครื่องหมายคำพูดคู่และไม่สามารถเป็นจุดสิ้นสุดของอินพุตได้ หลังจากการอ้างอิงสองครั้งมันอยู่นอกสตริงดังนั้นมันจึงไม่ใช่การแข่งขันอื่น มันผ่านการมองเชิงลบ
  • การแข่งขันเริ่มต้นที่ส่วนท้ายของสตริง มันตรงกับสตริงที่ว่างเปล่าในลักษณะเดียวกับกรณีก่อนหน้า แต่มันไม่สำคัญตามการชี้แจง
  • การแข่งขันจะเริ่มขึ้นตรงกลางของสตริง เป็นไปไม่ได้เพราะการจับคู่จะไม่ทับซ้อนกัน

จะ(\\.|[^"])ทำงานอย่างไร
Martin Ender

@ MartinBüttnerที่ตรงกับทุกอย่างยกเว้น "
Bálint

@ Bálintฉันหมายถึงแทนที่([^\\"]|\\.)ไม่ใช่เป็นโซลูชั่นที่สมบูรณ์
Martin Ender

@ MartinBüttnerโอ้โห
Bálint

ข้อเสนอแนะของมาร์ตินควรใช้งานได้เนื่องจาก\\.ล้มเหลวเฉพาะเมื่อไม่มีตัวละครหลังจาก\(หรืออักขระบรรทัดใหม่ แต่สามารถแก้ไขได้ด้วยการตั้งค่าสถานะ) และกรณีดังกล่าวถูกครอบคลุมโดยการมองเชิงลบ ตัวบ่งชี้ความเป็นเจ้าของป้องกันการย้อนรอยดังนั้นเราจึงไม่มีกรณีอื่นให้ดู
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

0

JavaScript ขนาด 24 ไบต์

"([^"\\]*(?:\\.[^"\\]*)*)"

กลุ่ม 1 คือเนื้อหาของสตริง


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

อ่าใช่ - ขอโทษ แล้วมันล่ะ?
Whothehellisthat

ปิด แต่ไม่มีซิการ์ที่คุณไม่ควรได้รับการจับคู่นอก"s
Ataco

ใช่นั่นคือสิ่งที่ฉันกลัว ไม่มีวิธีทำใน JavaScript ฉันเดาใช่มั้ย
Whothehellisthat

คุณสามารถจับภาพได้ในกลุ่มย่อย
ATaco

0

JavaScript, 21 15 13 12 ไบต์

"((\\?.)*?)"

เนื้อหาสตริงอยู่ในกลุ่ม 1

"   #start of string
(    #capturing group
 (
  \\?. #match character or escaped character
 )*?  #match as few as possible
)        
"   #end of string
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.