सबसे छोटी अनुपलब्ध नियमित अभिव्यक्ति


59

आपका मिशन सबसे कम वैध नियमित अभिव्यक्ति लिखना है, जिसमें कोई स्ट्रिंग मेल नहीं खा सकती है, खाली स्ट्रिंग शामिल है।

सबमिशन में यह फॉर्म होना चाहिए ("शाब्दिक अंकन"):

/pattern/optional-flags

सबसे छोटा रीगेक्सप जीतता है। Regexp का आकार पात्रों में गिना जाता है। (स्लैश और झंडे सहित)

कृपया बताएं कि आपका regexp कैसे काम करता है (यदि यह तुच्छ नहीं है)

धन्यवाद, और मजा!


इसने मुझसे एक प्रश्न को प्रेरित किया। मैं हालांकि कुछ दिन इंतजार करने जा रहा हूं। एक ही समय में 2 रेगेक्स प्रश्न सक्रिय नहीं करना चाहते हैं
क्रंचर

13
"मान्य" किस कार्यान्वयन के अनुसार? मैंने सिर्फ एक मनोरंजक पाया है कि पर्ल के साथ ठीक है (और यह केवल आरई व्याकरण के अनुसार मान्य है जो मुझे मिल सकता है , लेकिन उस ग्रीप और पायथन के पुन: मॉड्यूल मना कर देते हैं।
जोश कैसवेल

1
हाँ, रेगेक्स की कौन सी बोली है ? कई अलग-अलग हैं।
हिप्पिट्राईल

1
लेकिन राष्ट्रपति के नाम के बारे में क्या? xkcd.com/1313
कार्ल विटथॉफ्ट

@CarlWitthoft आपको उस प्रतियोगिता में भाग लेने के लिए एक कार्यक्रम होने की आवश्यकता है: codegolf.stackexchange.com/q/17718/2180
बूथ 18

जवाबों:


53

6 चरस

प्राइमो और पीटर टेलर के उत्तर और निम्नलिखित बातों के संकेत man perlre:

/(?!)/

यह पर्ल-संगत रेगेक्स एक खाली स्ट्रिंग से मेल खाता है, जिसके बाद एक और खाली स्ट्रिंग नहीं है।


+1 - यह संभवतः सबसे छोटा उत्तर है जो व्यापक रूप से पोर्टेबल है (साथ में /x\by/, लेकिन अगर मुझे वास्तव में इस तरह से एक regex का उपयोग करना पड़ा - जो भी कारण से - तो यह उत्तर भी सबसे स्पष्ट है)
मार्टिन एंडर

@ m.buettner: धन्यवाद। प्राइमो /(*FAIL)/शायद अधिक स्पष्ट है, हालांकि। (और वास्तव में man perlreयह उल्लेख करके कि मेरा वास्तव में उनके आंतरिक रूप से फैलता है दूर दे दिया।)
नैट एल्ड्रेडगे

/(*FAIL)/हालांकि उतना पोर्टेबल नहीं है। और यहां तक ​​कि पर्ल में, मुझे लगता है कि यह नकारात्मक रूप से देखने की तुलना में अधिक अस्पष्ट विशेषता है।
मार्टिन एंडर

3
आज के लगभग सभी लोकप्रिय (पर्ल-प्रेरित) स्वादों में आपको लार्वा मिला है, जबकि मैंने कभी भी इन नियंत्रण क्रियाओं को कहीं भी नहीं देखा, लेकिन पर्ल में।
मार्टिन एंडर

1
वास्तव में, पर्ल प्रलेखन (और -Mre=debug) जो कहता है (?!)में अनुकूलित है (*FAIL)(पर्ल regex अनुकूलक द्वारा OPFAILके अनुसार -Mre=debug)। इसके अलावा, मुझे नहीं लगता कि मैंने (*FAIL)पर्ल 5 (और पर्ल 6, जहां इसे कहा जाता है <!>) के बाहर देखा ।
कोनराड बोरोवस्की

39

8 चरस

/(?=a)b/

हमें एक चरित्र की आवश्यकता होती है जिसमें एक चरित्र होता है जो दोनों है aऔर b, जो स्पष्ट रूप से असंभव है।


19
/(?!x)x/और भी असंभव लगता है ;-)
हावर्ड

@PeterTaylor कहाँ है?
ओ ० '।

@ लोरिस, कहाँ?
पीटर टेलर

@PeterTaylor उसने उन बेतुके नियमों को कहां रखा, जिनके बारे में आप बात करते हैं, मैं उन्हें नहीं ढूंढ सका।
ओ ० '।

7
दोस्तों, मेरे द्वारा चुनी गई गिनती के लिए खेद है, मैंने सोचा कि वैकल्पिक झंडे के कारण स्लैश को शामिल करना सरल होगा जो उनके बाद आ सकते हैं।
xem

31

5 चरस

हर किसी के विपरीत जो गालियां देता है $और ^... यह वास्तव में पर्ल में काम करता है:

/V\A/

\A स्ट्रिंग की शुरुआत से मेल खाता है।


इसके साथ ^भी काम करता है।
टॉमस


28

8 अक्षर

/\w\b\w/

एक शब्द सीमा ( \b) 'शब्द' अक्षर ( \w- एक ) से घिरा हुआ है [_a-zA-Z0-9]। एक अक्षर से पहले या एक शब्द सीमा का पालन करने के बाद से यह अनुपलब्ध है, एक गैर-'शब्द 'वर्ण होना चाहिए।

वैसे: यह अप्राप्य अभिव्यक्ति के समान है

/\W\b\W/

जहां \Wगैर-'शब्द 'वर्ण है।


यह प्रतियोगिता के नियमों के अनुसार 8 वर्ण है, क्योंकि रैपिंग स्लैश की /गिनती होती है। उदाहरण के लिए, ओपी की प्रविष्टि देखें । यह एक महान प्रविष्टि है, हालांकि!
जोश कैसवेल

यह एक विजेता भी हो सकता है (या पीटर टेलर की प्रविष्टि के साथ बंधे हुए ), कुछ छोटी प्रविष्टियों के साथ कार्यान्वयन-निर्भर समस्याओं को देखते हुए !
जोश कैसवेल

बहुत खूबसूरत! मैंने सोचा कि कुछ ऐसा होना चाहिए!
टॉमस

22

4 चरस

/$a/

स्ट्रिंग के अंत के बाद "a" खोजता है।

या

/a^/

स्ट्रिंग की शुरुआत से पहले खोज करता है।


20
यदि आपको पता है कि दो-चार समाधान है तो प्रश्न क्यों पोस्ट करें?
पीटर टेलर

3
@ हॉवर्ड: यह एक खाली स्ट्रिंग से मेल खाता है: jsfiddle.net/RjLxJ
ProgramFOX

10
एक अपराजेय समाधान प्रदान किए जाने के बाद मुझे हमेशा ये समस्याएं क्यों आती हैं :(
क्रंचर

43
-1: पुटिंग ^और $"गैरकानूनी" पदों पर बस उन्हें साधारण पात्रों के रूप में माना जाता है। आपका पहला उदाहरण शाब्दिक से मेल खाता $aमें sedऔर शायद अन्य कार्यक्रमों।
बेन जैक्सन

2
@ जैक्सन, यह POSIX EREs के लिए सही नहीं है। कोशिश echo 'a^b' | grep 'a^b'बनाम echo 'a^b' | grep -E 'a^b'9.4.9 ERE एक्सप्रेशन एंकरिंग की
laindir

21

5 अक्षर

/$.^/

/$^/ एक खाली स्ट्रिंग से मेल खाएगा, जबकि बीच में एक चरित्र की आवश्यकता नहीं होगी।


6
यह दुर्भाग्य से पर्ल ( और शायद सेड ) "$a^"में मेल खाता है (या इसके स्थान पर )। फिर भी एक अच्छा, हालांकि! 'a'
जोश कैसवेल

@ जोशसवेल: मेरा मानना ​​है कि पर्ल $.वर्तमान लाइन नंबर चर के रूप में व्याख्या कर सकता है । जो खाली हो सकता है, जिस स्थिति में यह होगा /^/
एमवीजी

एक वर्ण 'के बीच' का अर्थ केवल एक-वर्ण स्ट्रिंग है।
jwg

3
@ jwg ने अदला बदली ^और$
maniip

मैंने '$^'grep के साथ पैटर्न की कोशिश की , लेकिन दुर्भाग्य से यह स्ट्रिंग से मेल खाता था '$^'। स्मार्टास ग्रीप।
joeytwiddle

19

9 चरस

मुझे यकीन नहीं है लेकिन /[^\S\s]/किसी भी चरित्र का मतलब नहीं है, लेकिन उनमें से कम से कम एक का मतलब नहीं होना चाहिए।


आप की जरूरत नहीं है +
पीटर टेलर

10
/ [^ \ S \ s] / = 9 वर्ण
xem

19

6 अक्षर

मुझे लगता है कि यह रेगेक्स मैंने बनाया है:

/\b\B/

यह एक शब्द सीमा ( \b) से मेल खाता है जो एक शब्द सीमा ( ) नहीं है \B। जो कि थोपा गया है- क्या मुझे वास्तव में आपको यह समझाना है?


क्या यह एक शब्द-सीमा की खोज नहीं है जिसके बाद एक गैर-शब्द-सीमा है?
grexter89

1
@ grexter89 हाँ, लेकिन वे बीच में कोई वर्ण नहीं रख सकते। यानी सीमा और गैर-सीमा को एक ही स्थान पर कब्जा करना होगा।
द हेट

2
मैं यह पसंद है। अच्छी पकड़।
प्राइमो

18

4 अक्षर

(केवल ECMAScript फ्लेवर)

/[]/

अन्य जायके में यह एक वैध चरित्र वर्ग (नहीं है ]एक चरित्र पर विचार किया जाएगा में वर्ग, इसलिए अभिव्यक्ति क्योंकि वर्ग कभी नहीं बंद कर दिया है, मान्य नहीं है), लेकिन ECMAScript मानक खाली चरित्र वर्गों स्वीकार करता है। चूँकि यह एक ऐसा वर्ग है, जिसमें किसी पात्र से मेल खाना होता है (इसलिए खाली तार मेल नहीं खाते), लेकिन चूंकि एक भी वर्ण शामिल नहीं है, कोई वास्तविक वर्ण भी मेल नहीं खाएगा।


भले ही आप कहते हैं कि यह एक चरित्र से मेल खाता है, क्या यह खाली स्ट्रिंग से मेल नहीं खाएगा? या आपको लगता है कि यह अवैध है /[]{0}/:। (पीएस, हालांकि मेरा अपना जवाब आंशिक रूप से आपकी तरह दिखता है, मैं वास्तव में मेरा लिखने के बाद तुम्हारा पढ़ता हूं।)
nl-x

@ nl-x इसे अपने ब्राउज़र के कंसोल में पेस्ट करें /[]/.test(""):। यह गलत है। एक वर्ण वर्ग कभी भी एक रिक्त स्ट्रिंग से मेल नहीं खा सकता है, भले ही उसमें वर्ण न हों (मुझे लगता है कि वे "जैसे यदि" स्ट्रिंग में अगला वर्ण सूचीबद्ध है, मैच में से एक है, तो इसे लागू किया जाता है; ELSE विफल ")। /[]{0}/कानूनी है (ECMAScript में) और खाली स्ट्रिंग से मेल खाता है ... हालांकि, मुझे यकीन नहीं है कि यह मेरे उत्तर के लिए कैसे प्रासंगिक है।
मार्टिन एंडर

रूबी 2.0 में विफल
नाकीलोन

@Nakilon बेशक यह करता है। रूबी ECMAScript फ्लेवर को लागू नहीं करती है।
मार्टिन एंडर

15

6 चरस

/b++b/

संभव मात्रात्मक रूप में संभव के रूप में कई बी के लिए लग रहा है, तो 1 और। 6 वर्ण लेकिन समरूपता के लिए अंक?


हुंह ... मैंने अभी एक नई सुविधा सीखी है। जाहिर है, मेरे रेगेक्स कौशल बुरी तरह से पुराने हैं। धन्यवाद, और +1।
इल्मरी करोनें

8

6 अक्षर

/(\1)/

विजेता नहीं, लेकिन मुझे लगा कि यह मजेदार है। grep और Python दोनों इस एक पर बारफ करते हैं, लेकिन पर्ल इसके साथ ठीक लगता है।

बहुत कार्यान्वयन पर निर्भर होने लगता है (जो शायद ही आश्चर्य की बात है, इसकी अजीबता को देखते हुए)। नीचे बॉब की रिपोर्ट है कि यह जावास्क्रिप्ट के रेगेक्स इंजन में कुछ भी मेल खाता है ।


.NET का regex इंजन इसे स्वीकार करता है।
Bob

और यह हमेशा मेल खाता है (एक खाली स्ट्रिंग) कोई फर्क नहीं पड़ता कि जेएस पर क्या इनपुट
बॉब

8

शायद थोड़ा सा धोखा, लेकिन…

\0

... लगभग सभी में POSIX regex में उपलब्ध नहीं है, यदि सभी, कार्यान्वयन नहीं हैं। बुनियादी आरई और विस्तारित आरई, यहां तक ​​कि।

और POSIX RE को उन pesky स्लैश और झंडे की आवश्यकता नहीं है जो PCRE के पास हैं।


+1 अच्छा !! Unfortunatelly, एकमात्र 0PERL में काम नहीं करता है। "0"=~0सच है ...
टॉमस

एकमात्र \0ITYM? हां, अधिकांश पेरेल्रे (1) और पीसीआरई कार्यान्वयन सी स्ट्रिंग्स का उपयोग नहीं करते हैं, लेकिन आकार-बाउंडेड बफ़र्स, जिसमें यह ट्रिक काम नहीं करेगा, लेकिन अधिकांश पॉस आरईई कार्यान्वयन सी स्ट्रिंग्स पर काम करते हैं।
mirabilos

5

5 चरस

/^.^/

स्ट्रिंग स्ट्रिंग जो किसी भी एकल वर्ण के साथ शुरू होने से पहले शुरू होती है।


6
इसके अलावा स्ट्रिंग से मेल खाता है".^"
बूथबाई

@ बॉबी: किस भाषा में मेल खाता है? अजगर में नहीं है। re.findall(r'^.^', '.^', re.DEBUG)
P --x39L̳

8
मंगा ऑपरेटर का उपयोग करने के लिए +1 (देखें stackoverflow.com/questions/3618340/… )
प्रोटोटाइप

@boothby ^और metacharacters .हैं शाब्दिक नहीं, कि बच निकलने की जरूरत है
P̲̳x͓L14

1
यह पर्ल में टूट गया है। यह प्रश्न वास्तव में भाषा के बारे में कुछ जमीनी नियम निर्धारित करना चाहिए था।
बूथबीज

5

4 चार:

/.^/

GNU grep 2.5.1 और egrep के साथ काम करता है।



आपको इसकी आवश्यकता क्यों है //? हर जगह की आवश्यकता नहीं है ;-)
RSFalcon7

रैपिंग स्लैश की /गिनती, मूल प्रश्न ("स्लैश और फ़्लैग्स सहित)" और ओपी की प्रविष्टि देखें
एलेक्सी पोपकोव

सही! मुझे पढ़ना याद है :(
RSFalcon7

नहीं, नीचे दिए गए एक ही कारण के लिए: वास्तव में, "^" केवल विशेष है यदि पैटर्न की शुरुआत में। किसी भी अन्य चीज़ के बाद "^" को भागने की आवश्यकता नहीं है, इसलिए यह उत्तर गलत है।
mirabilos

4

पर्ल 6 (5 अक्षर)

/<!>/

सॉर्टा नियम का दुरुपयोग (क्योंकि पर्ल 6 रेग्जेस अलग-अलग हैं, और डिजाइन द्वारा स्टारड रेजगेस के साथ असंगत हैं), लेकिन मुझे परवाह नहीं है। <!>नियम पर्ल 6 को सूचित करता है कि रेगेक्स मेल नहीं खाता है।


4

6 बाइट्स

/(*F)/

के लिए एक संक्षिप्त नाम (*FAIL), पर्ल-कॉम्पेटिबल रेगेक्स इंजन द्वारा समर्थित है। इसे इंगित करने के लिए @ HamZa को धन्यवाद ।

9 बाइट्स

/(*FAIL)/

किसी भी रेगेक्स इंजन के साथ काम करना चाहिए जो क्रियाओं का समर्थन करता है। मुझे यकीन नहीं है कि यह वास्तव में किसी भी आगे बढ़ने की आवश्यकता है।


1
यह कैसे काम करता है?
बूथबी

@ बॉथबी (*FAIL)एक क्रिया है जो हमेशा विफल होती है।
Primo

@primo तुम सिर्फ इस्तेमाल कर सकते हैं /(*F)/:)
HamZa

4

4 चरस

/$./

स्ट्रिंग समाप्त होने के बाद किसी भी वर्ण की आवश्यकता होती है


अन्य दो $के समान, पैटर्न के अंत में केवल विशेष है।
मिराबिलोस

3

2 के बिना स्लैश के साथ 4 चार्ट

TXR भाषा के रेगेक्स इंजन में, एक खाली वर्ण वर्ग []किसी वर्ण से मेल नहीं खाता है, और इसलिए कोई स्ट्रिंग नहीं है। यह इस तरह से व्यवहार करता है क्योंकि चरित्र वर्ग को एक चरित्र मैच की आवश्यकता होती है, और जब यह खाली होता है तो यह निर्दिष्ट करता है कि कोई भी चरित्र इसे संतुष्ट नहीं कर सकता है।

एक अन्य तरीका /.*/पूरक ऑपरेटर का उपयोग करके "खाली सहित सभी स्ट्रिंग्स" रेगेक्स का "उल्टा करना " है /~.*/। उस सेट के पूरक में कोई तार नहीं है, और इसलिए कुछ भी मेल नहीं खा सकता है।

यह आदमी पृष्ठ में सभी प्रलेखित है:

   nomatch
          The  nomatch  regular  expression  represents  the empty set: it
          matches no strings at all, not even the empty string.  There  is
          no  dedicated  syntax  to  directly express nomatch in the regex
          language.  However, the empty character class []  is  equivalent
          to nomatch, and may be considered to be a notation for it. Other
          representations of nomatch are possible: for instance, the regex
          ~.* which is the complement of the regex that denotes the set of
          all possible strings, and thus denotes the empty set. A  nomatch
          has  uses;  for instance, it can be used to temporarily "comment
          out" regular expressions. The regex ([]abc|xyz) is equivalent to
          (xyz), since the []abc branch cannot match anything. Using [] to
          "block" a subexpression allows you to leave it  in  place,  then
          enable it later by removing the "block".

स्लैश प्रति रेगेक्स सिंटैक्स का हिस्सा नहीं है; वे बस विराम चिह्न हैं जो एस-अभिव्यक्ति संकेतन में रेगीक्स का परिसीमन करते हैं। गवाह:

# match line of input with x variable, and then parse that as a regex
#
$ txr -c '@x
@(do (print (regex-parse x)) (put-char #\newline))' -
ab.*c                               <- input from tty: no slashes.
(compound #\a #\b (0+ wild) #\c)    <- output: AST of regex

आपके उत्तर के लिए धन्यवाद और स्लैश-गिनती के लिए फिर से खेद है। मुझे लगा कि अगर लोगों ने झंडे का इस्तेमाल किया तो उन्हें शामिल करना आसान होगा।
XEM

1

6 चरस

(या 4, आप इसे कैसे देखते हैं इसके आधार पर)

/{,0}/

रूबी 2.0 में फेल
नाॅकिलोन

किस रेगेक्स कार्यान्वयन में यह त्रुटि नहीं देता है?
पीटर टेलर

मैंने केवल PHP के preg_match का उपयोग करके इसका परीक्षण किया।
टर्की

1

यह एक 5 char regex है।

/[]+/

यह एक खाली समूह से 1 या अधिक बार मेल खाता है।

संपादित करें:

अन्य स्वादों के लिए मेरा उत्तर हटा दिया:

/.{-1}/

जो कुछ भी {} के अंदर नंबर नहीं है वह टेक्स्ट से मेल खाएगा।

यह एक मैच होगा "{! - 1}"


ध्यान दें कि यह केवल ECMAScript फ्लेवर में काम करता है। अधिकांश (सभी?) दूसरों में यह एक वैध अभिव्यक्ति नहीं है।
मार्टिन एंडर

क्या यह अमान्य नहीं है?
वासि

@ इमासस्क्रिप्ट-अनुरूप फ्लेवर में नहीं
मार्टिन

0

5 अक्षर

उम्मीद है कि यह ध्वनि बेवकूफ नहीं है: /[]+/


नहीं। वैध रेगेक्स नहीं।
द गाइ हेट

@RyanCarlson यह वैध और कानूनी है ... कम से कम एक्मास्क्रिप्ट में।
nl-x

-1
/$^/

एक चीज़ जो शुरू होने से पहले ही खत्म हो जाती है ...


7
खाली स्ट्रिंग (कुछ आरई कार्यान्वयन में, वैसे भी) से मेल खाती है।
जोश कैसवेल

1
आपका कार्यान्वयन टूट गया है :)
सिमोन


7
इससे भी महत्वपूर्ण बात, के रूप में बेन जैक्सन ने कहा , पर्ल में, जहां यह मेल नहीं खाता ""है, यह है एक स्ट्रिंग उन दो शाब्दिक वर्णों से युक्त से मेल खाते हैं: "$^"
जोश कैसवेल

+1 मैं बस वही पोस्ट करना चाहता था! @ जोश, यह पर्ल में काम करता है, और यह खाली स्ट्रिंग से मेल नहीं खाता है! बेन की टिप्पणी टूट गई है, मैंने इसका जवाब दिया।
टॉमस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.