RegEx-golf: एक स्ट्रिंग में सभी सामग्री से मेल खाते हैं


10

आपका कार्य एक RegEx लिखना है जो स्ट्रिंग्स के अंदर हर चीज से मेल खाता है।

एक स्ट्रिंग को दो unescaped से घिरा हुआ (लेकिन शामिल नहीं) सब कुछ के रूप में परिभाषित किया गया है "

"से बच सकते हैं \, जो फिर से बच भी सकते हैं।

परीक्षण के मामलों

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

स्कोरिंग

सबसे छोटा समाधान जीतता है।

चश्मा

  • कृपया उपयोग किए गए स्वाद को निर्दिष्ट करें।
  • इनपुट संतुलित होगा "
  • ऐसा नहीं होगा \कि तुरंत एक स्ट्रिंग-शुरुआत-सीमांकक से पहले हो। उदाहरण के लिए, आपको संभालने की आवश्यकता नहीं होगीabc\"def"

1
क्या \एक तार से पहले होगा ? उदाहरण के लिए abc\"def"
jimmy23013

यह एक समूह में प्रत्येक स्ट्रिंग से मेल खाना चाहिए? उदाहरण के लिए, क्या मैं कुछ ऐसा लिख ​​सकता हूं जिसमें दो मैच हों abc"de", एक है dऔर दूसरा है e?
jimmy23013

यह मान्य है ।
लीक नून

क्या खाली तार होंगे?
मार्टिन एंडर

हां, खाली तार होंगे।
लीक नून

जवाबों:


3

पीसीआरई, 21 20 15 19 बाइट्स

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

इसे यहाँ आज़माएँ।

यह एक चरित्र (या इनपुट की शुरुआत) से पहले दोहरे उद्धरण से मेल खाता है और फिर मैच को रीसेट करता है, यह सुनिश्चित करने के लिए कि डबल उद्धरण किसी अन्य मैच के साथ साझा नहीं किया गया है।

पीसीआरई, 25 23 बाइट्स

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.

ध्यान दें कि निपुण क्वांटिफायर ( *+) सुनिश्चित करता है कि नकारात्मक लुकहेड हमेशा एक पूरे स्ट्रिंग या गैर-स्ट्रिंग के पूरे खंड के बाद शुरू होता है।

4 मामले हैं:

  • मैच एक तार के बाहर कहीं भी शुरू होता है। \\.स्पष्टीकरण के अनुसार एक दोहरे उद्धरण का मिलान कभी नहीं होगा। यह केवल अगले दोहरे उद्धरण से पहले समाप्त हो सकता है जो एक स्ट्रिंग, या इनपुट की समाप्ति शुरू करता है। दोनों मामले नकारात्मक रूपांतर को विफल करते हैं।
  • मैच एक स्ट्रिंग की शुरुआत में शुरू होता है। (\\.|[^"])*+एक पूरी स्ट्रिंग से मेल खाएगा। अगला चरित्र एक डबल उद्धरण होना चाहिए, और इनपुट का अंत नहीं हो सकता है। दोहरे उद्धरण के बाद यह स्ट्रिंग के बाहर है, इसलिए यह दूसरा मैच नहीं हो सकता है। तो यह नकारात्मक रूपांतर से गुजरता है।
  • मैच एक स्ट्रिंग के अंत में शुरू होता है। यह पिछले मामले की तरह ही एक खाली स्ट्रिंग से मेल खाता है। लेकिन यह स्पष्टीकरण के अनुसार कोई फर्क नहीं पड़ता।
  • मैच एक स्ट्रिंग के बीच में शुरू होता है। असंभव क्योंकि मैच ओवरलैप नहीं होते हैं।

चाहेंगे (\\.|[^"])काम करते हैं?
मार्टिन एंडर

@ MartinBüttner को छोड़कर "सब कुछ से मेल खाता है
Bálint

@ बैलिंट का मतलब मेरे स्थान पर था ([^\\"]|\\.), न कि पूर्ण समाधान के रूप में।
मार्टिन एंडर

@ MartinBüttner ओह, ठीक
Bálint

मार्टिन का सुझाव काम करना चाहिए, क्योंकि \\.केवल तब विफल होता है जब कोई चरित्र नहीं होता है \(या नई पंक्ति का चरित्र, लेकिन यह ध्वज के साथ तय किया जा सकता है), और यह मामला नकारात्मक रूप से पीछे से कवर किया गया है। संपत्ति का परिमाणक पीछे जाने से रोकता है, इसलिए हमारे पास देखने के लिए कोई अन्य मामला नहीं है।
n --h'a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

0

जावास्क्रिप्ट, 24 बाइट्स

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

समूह 1 स्ट्रिंग की सामग्री है।


यह बच गए उद्धरणों के साथ बिल्कुल भी काम नहीं करता है, और इस प्रकार कल्पना को पूरा करने में विफल रहता है।
अताको

आह हाँ - सॉरी। उस के बारे में कैसा है?
पूर्णाहुति

बंद करें, लेकिन सिगार नहीं है, तो आपको बाहरी "s
ATaco

हाँ, यही मैं डरता था। जावास्क्रिप्ट में ऐसा करने का कोई तरीका नहीं, मैं अनुमान लगा रहा हूं?
22

आप इसे एक उपसमूह पर कब्जा कर सकते हैं
ATaco

0

जावास्क्रिप्ट, 21 15 13 12 बाइट्स

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

स्ट्रिंग सामग्री समूह 1 में हैं।

"   #start of string
(    #capturing group
 (
  \\?. #match character or escaped character
 )*?  #match as few as possible
)        
"   #end of string
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.