3 पॉइंट द्वारा GN⁺ 14 시간 전 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Regular expressions में हर implementation के अनुसार supported features और syntax अलग होते हैं, इसलिए जो pattern एक tool में काम करता है वह दूसरे environment में fail हो सकता है या उसमें बदलाव की ज़रूरत पड़ सकती है
  • Perl जैसे feature-rich environment की आदत होने पर compatibility समस्याएँ ज़्यादा दिखती हैं, और अगर उन computers को भी ध्यान में रखें जहाँ install करने की permission नहीं है, तो common subset का इस्तेमाल करना अधिक सुरक्षित है
  • “हर जगह” को सबसे सख्ती से परिभाषित करें तो दायरा इतना सीमित रह जाता है कि सिर्फ literals, […] character classes, और . * ^ $ जैसे basic special characters ही बचते हैं
  • GNU sed, awk, grep के साथ sed और grep के -E option का उपयोग करने पर इस्तेमाल किए जा सकने वाले common features का दायरा बढ़ जाता है, लेकिन इस combination में awk आम तौर पर lowest common denominator बन जाता है
  • Emacs में +? ( ) { } | के लिए backslash चाहिए होता है, और \s, \S का मतलब भी अलग होता है, इसलिए एक ही regular expression को कई tools में इस्तेमाल करना हो तो exception syntax भी जाँचना पड़ता है

regular expression compatibility कठिन क्यों है

  • Regular expressions की सबसे बड़ी असुविधा implementation differences से आती है
    • किसी tool में supported feature दूसरे tool में बिल्कुल न हो सकती है
    • एक ही feature के लिए syntax भी थोड़ा-थोड़ा अलग हो सकता है
  • Perl एक feature-rich regular expression environment है, इसलिए Perl के हिसाब से जो features स्वाभाविक लगती हैं वे दूसरे environments में गायब हो सकती हैं
  • दूसरे tools के Perl-जैसे replacement इस्तेमाल करने का तरीका भी है, लेकिन वे standard नहीं होते, इसलिए सहकर्मियों या ग्राहकों को तुरंत चलने वाला code भेजना कठिन हो जाता है
  • अगर उन computers पर काम करने की स्थिति भी शामिल करें जहाँ software install नहीं किया जा सकता, तो कई environments में चलने वाले regular expression features के subset को ढूँढने वाला approach ज़रूरी हो जाता है
  • “हर जगह” की परिभाषा जितनी सख्त होगी, इस्तेमाल करने योग्य features उतनी कम होंगी
    • literals
    • […] character classes
    • . * ^ $ special characters

sed, awk, grep, Emacs में common दायरा

  • अगर target tools को sed, awk, grep, Emacs तक सीमित करें, तो “हर जगह” के मानदंड को थोड़ा ढीला रखा जा सकता है
  • GNU version के sed, awk, grep का उपयोग करें और sedgrep पर -E option लागू करें, तो common features की सूची विस्तृत हो जाती है
    • तीनों tools की regular expression capabilities काफ़ी मिलती-जुलती हैं
    • awk की features आम तौर पर दूसरे tools में भी supported होती हैं
    • एक अपवाद के रूप में word boundary के लिए awk में \<, \> का उपयोग होता है, जो \b, \B से अलग है
  • Emacs, awk की अधिकांश features के अनुरूप है, लेकिन syntax में अंतर है
    • + ? ( ) { } | को awk जैसी भूमिका देने के लिए इनके आगे backslash लगाना पड़ता है
    • awk के \s, \S के समकक्ष Emacs में \s-, \S- हैं
  • Emacs में \s, \S whitespace/non-whitespace नहीं, बल्कि character class की शुरुआत करते हैं
    • - class का मतलब whitespace है
    • \s. punctuation character है
    • \S. non-punctuation character है
  • इस मानदंड में उपयोग की जा सकने वाली features इस प्रकार हैं
    • .
    • ^, $
    • […], [^…]
    • *
    • \w, \W, \s, \S
    • \1 से \9 तक के backreferences
    • \b, \B
    • ?, +
    • | alternation
    • {n,m} repetition count
    • (...) capture
  • हालांकि gawk replacement string में backreferences को support करता है, लेकिन regular expression में backreferences को support नहीं करता
  • look-around को advanced feature माना जा सकता है, और \d digits के लिए basic feature जैसा लग सकता है, लेकिन कई regular expression variants में यह supported नहीं है

1 टिप्पणियां

 
Hacker News की राय
  • Emacs में क्या escape करना है, यह लगभग अंदाजा लगाकर चलने जैसा लगता है, इसलिए खास तौर पर मुश्किल होती है
    rx नाम का एक alternative भी है[0], लेकिन असल में उसे इस्तेमाल करना बहुत सुखद नहीं है
    regex syntax से आगे बढ़कर, actual use के दौरान भी encoding और escaping की समस्याएं अक्सर आती हैं
    shell में regex डालें तो उसे सही तरह से escape करना पड़ता है, और Python में देखना पड़ता है कि वह raw string है या नहीं
    फिर भी ज्यादातर tools में regex इस्तेमाल करने का तरीका किसी हद तक मिलते-जुलते दायरे में आ गया है, यह आधुनिक दौर के चमत्कार जैसा है
    [0]: https://www.gnu.org/software/emacs/manual/html_node/elisp/Rx...

    • अगर आप ऐसा Python लिखें जो regex वाला shell script generate करता हो, तो मामला और मजेदार हो जाता है
      अलग-अलग escaping rules के layer एक-दूसरे पर चढ़ते रहते हैं
    • जबरन कोई फायदा ढूंढना हो तो, search target Elisp code हो तो ( और ) का literal match होना थोड़ा सुविधाजनक है
    • regex को कई DSL के खिचड़ी mix की जगह एक structured language होना चाहिए था
  • लेखक लगभग वहां तक पहुंचते-पहुंचते लगता है कि आखिरकार POSIX basic regular expressions हर जगह चलते हैं
    हालांकि caveat यह है कि हर कोई Single Unix Specification 8th edition तक नहीं पहुंचा है, और उस edition में BRE थोड़ा बदल गया था

    • यह आकलन लेखक के प्रति न्यायसंगत नहीं लगता
      अगर ऐसा caveat नहीं होता, तो वह लेख लिखने की जरूरत ही शायद नहीं पड़ती
  • पहले मैंने ऐसे regex खोजने पर एक paper लिखा था जो greedy semantics और leftmost maximal semantics दोनों में एक ही तरह से match होते हैं
    https://par.nsf.gov/servlets/purl/10534654

  • मैं हमेशा इस बात को लेकर काफी picky रहा हूं कि कौन सा tool कौन सी regex language accept करता है, और वह arbitrary substring, prefix, suffix, whole string, एक line, या line के अंदर substring में से किसे match करता है
    यहां [ज्यादा व्यापक रूप से इस्तेमाल होने वाले][1] कुछ हैं, और इनके अलावा PCRE और Python भी हैं
    grep जैसी जगहों में दिखने वाले कुछ पुराने formats [POSIX में specified हैं][2], यह जानने में मुझे थोड़ा समय लगा
    [1]: https://cppreference.com/cpp/regex#Regular_expression_gramma...
    [2]: https://pubs.opengroup.org/onlinepubs/009696899/basedefs/xbd...

  • Russ Cox का regex page share करना चाहूंगा
    मेरे हिसाब से यह पढ़ने लायक अच्छा resource है
    https://swtch.com/~rsc/regexp/

  • इसी वजह से RFC 9485, I-Regexp: An Interoperable Regular Expression Format, महत्वपूर्ण है
    https://datatracker.ietf.org/doc/html/rfc9485

  • Go standard library का regexp package RE2 engine इस्तेमाल करता है, इसलिए backreferences support नहीं करता
    substitution में इस्तेमाल कर सकते हैं, लेकिन matching में नहीं

    • regexp असल में re2 इस्तेमाल नहीं करता, बल्कि वही concept अलग से implement करता है
  • rule engines, template engines, और IFTTT जैसी engines में ऐसी ही frustration झेलने के बाद मैंने JSONLogic के लिए Rust library बनाई, और दूसरे languages के bindings भी इस्तेमाल करता हूं
    https://github.com/GoPlasmatic/datalogic-rs

  • JSON Schema docs में भी एक recommended regex subset है
    https://json-schema.org/understanding-json-schema/reference/...