समस्या
रेगेक्स के साथ एक क्रमचय प्राप्त करने का कोई आसान तरीका नहीं है।
- क्रमपरिवर्तन: एक शब्द x_n (“aabc”) को दूसरे क्रम में, बिना संख्या या अक्षरों के परिवर्तन के।
- रेगेक्स: नियमित अभिव्यक्ति।
सत्यापन के लिए:
- "पुनरावृत्ति के बिना Regex क्रमपरिवर्तन" जवाब एक रेगेक्स के बजाय जावास्क्रिप्ट कोड बनाता है, यह मानते हुए कि यह अधिक सरल होगा।
- "किसी दिए गए पाठ में दिए गए शब्द के सभी क्रमपरिवर्तन को कैसे खोजें" - जवाब regexes का उपयोग नहीं करता है।
- "रेपेक्स सभी पुनरावृत्ति के बिना, सभी {1, 2, 3, 4} से मिलान करने के लिए" - उत्तर रेगेक्स का उपयोग करता है, लेकिन यह न तो अनुकूल है और न ही सरल है।
- यह उत्तर यहां तक दावा करता है: "एक नियमित अभिव्यक्ति वह नहीं कर सकती जो आप पूछ रहे हैं। यह स्ट्रिंग से क्रमपरिवर्तन उत्पन्न नहीं कर सकता है" ।
मैं जिस तरह का समाधान खोज रहा हूं
इसका रूप होना चाहिए:
- »Aabc« (या कुछ और आप एक उद्घाटन और समापन कोष्ठक का उपयोग कर सकते हैं)
- (Aabc)! (इसी तरह) (एबीसी)? लेकिन अंत में एक और प्रतीक के साथ)
- [Aabc]! (इसी तरह [एबीसी] + लेकिन अंत में एक और प्रतीक के साथ)
इन समाधानों के लाभ
वो हैं:
- आसान
- अनुकूलनीय
- पुन: प्रयोज्य
ऐसा क्यों होना चाहिए
- Regexes एक नियमित भाषा के व्याकरण का वर्णन करने का एक तरीका है। उनके पास किसी भी तरह की नियमित भाषा होने की पूरी शक्ति है।
- मान लीजिए, नियमित भाषाएं क्रमपरिवर्तन के लिए पर्याप्त शक्तिशाली हैं (नीचे प्रमाण) - इसे व्यक्त करने का कोई आसान तरीका क्यों नहीं है?
तो मेरा सवाल है:
- (क्यों) क्या मेरा प्रमाण गलत है?
- यदि यह सही है: तो क्रमपरिवर्तन व्यक्त करने का कोई आसान तरीका क्यों नहीं है?
सबूत
- नियमित भाव एक नियमित भाषा के व्याकरण को नोट करने का एक तरीका है। वे किसी भी नियमित भाषा व्याकरण का वर्णन कर सकते हैं।
- किसी भी नियमित भाषाओं का वर्णन करने का एक अन्य तरीका (जिसमें उनकी वर्णमाला के भीतर अक्षरों की एक सीमित संख्या है) व्याकरण गैर-नियतात्मक ऑटोमैटोन (राज्यों की एक सीमित संख्या के साथ) हैं।
अक्षरों की एक सीमित संख्या होने से मैं यह ऑटोमेटन बना सकता हूं: (उदाहरण: औपचारिक: नीचे देखें)
व्याकरण जो "abbc" के क्रमपरिवर्तन को स्वीकार करता है:
(शीर्ष पर संख्याओं के लिए sry, शायद किसी को पता है कि इस भाग को बेहतर कैसे बनाना है)
s -> आह¹
s -> bh -
s -> ch³
h -> bh¹¹
h -> ch¹
h -> ah² (कोई टाइपो! समतुल्यता)
h -> bh²²
h -> ch²
h -> आह³
h -> bh²³
h -> ई.पू.
h -> सीबी
h -> बी.बी.
h -> एसी
h -> सीए
h -> अब
h -> बा
अधिक औपचारिक: (एक परिमित-राज्य-ऑटोमेटन का उपयोग करके लेकिन यह व्याकरण के साथ भी बनाया जा सकता है)
- एक शब्द क्यू (परिमित लंबाई के साथ) जिसमें किसी भी क्रमपरिवर्तन को स्वीकार करने की स्थिति में पहुंचना चाहिए।
- X परिमित वर्णमाला है।
- राज्यों के सेट में क्ष की लंबाई तक अक्षरों का कोई भी क्रम होता है। (अतः S का आकार परिमित है।) "किसी भी लंबे शब्द" की एक अवस्था।
- राज्य संक्रमण फ़ंक्शन d जो एक अक्षर लेता है और उस स्थिति पर चलता है जो शब्द के अब पढ़े गए भाग से मेल खाती है।
- F उस अवस्था का एक सेट है जो q के सटीक क्रमपरिवर्तन है।
इसलिए किसी दिए गए शब्द के क्रमपरिवर्तन को स्वीकार करने के लिए एक परिमित राज्य ऑटोमेटन बनाना संभव है।
प्रमाण के साथ आगे बढ़ना
इसलिए मैंने साबित कर दिया है कि नियमित भाषाओं में क्रमपरिवर्तन के लिए जाँच करने की शक्ति है, है न?
तो रेगेक्स के साथ इस तक पहुंचने के लिए कोई दृष्टिकोण क्यों नहीं है? यह एक उपयोगी कार्यक्षमता है।
^(a()|a()|b()|c()){4}\2\3\4\5$
काम करने लगता है (देखें regex101.com/r/9URPpg/4/tests )।