রেগেক্সগুলি রক্ষণাবেক্ষণযোগ্য করে তোলা
পূর্বে "নিয়মিত অভিব্যক্তি" হিসাবে বর্ণিত নিদর্শনগুলিকে নির্মূল করার দিকে অগ্রণী অগ্রাধিকার হ'ল পার্লের /x
রেইগেক্স পতাকা - কখনও কখনও (?x)
এম্বেড করা অবস্থায় লেখা হয় - যা শ্বেত স্পেস (লাইন ব্রেকিং, ইনডেন্টিং) এবং মন্তব্যের অনুমতি দেয়। এটি গুরুত্ব সহকারে পঠনযোগ্যতা এবং তাই রক্ষণাবেক্ষণের উন্নতি করে। সাদা স্থান জ্ঞানীয় ছোটাছুটি করার অনুমতি দেয়, তাই আপনি কীগুলির সাথে কী গোষ্ঠীগুলি দেখতে পারেন।
আধুনিক নিদর্শনগুলি এখন তুলনামূলকভাবে সংখ্যাযুক্ত এবং নামযুক্ত ব্যাকরিফারেন্স উভয়ই এখন সমর্থন করে। এর অর্থ আপনার প্রয়োজন $4
বা এটি নির্ধারণের জন্য ক্যাপচার গ্রুপগুলি গণনা করার দরকার নেই \7
। পরবর্তী নিদর্শনগুলিতে অন্তর্ভুক্ত করা যেতে পারে এমন নিদর্শন তৈরি করার সময় এটি সহায়তা করে।
এখানে তুলনামূলকভাবে সংখ্যাযুক্ত ক্যাপচার গ্রুপের একটি উদাহরণ রয়েছে:
$ ডুপওয়ার্ড = কিউআর {\ বি (?: (\ ডাব্লু +) (?: \ এস + \ জি {-1}) +) \ বি} xi;
$ উদ্ধৃত = কিউআর {(["']) $ ডুপওয়ার্ড \ 1} x;
এবং নামযুক্ত ক্যাপচারগুলির উচ্চতর পদ্ধতির উদাহরণ এখানে রয়েছে:
$dupword = qr{ \b (?: (?<word> \w+ ) (?: \s+ \k<word> )+ ) \b }xi;
$quoted = qr{ (?<quote> ["'] ) $dupword \g{quote} }x;
ব্যাকরণগত রেজেক্সেস
সর্বোপরি , এই নামকৃত ক্যাপচারগুলি একটি (?(DEFINE)...)
ব্লকের মধ্যে স্থাপন করা যেতে পারে , যাতে আপনি আপনার নিদর্শনগুলির পৃথক নামকরণকারী উপাদানগুলির সম্পাদন থেকে ঘোষণাটি আলাদা করতে পারেন। এটি সেগুলিকে প্যাটার্নের মধ্যে সাব্রুটাইনগুলির মতো কাজ করে তোলে।
"ব্যাকরণগত Regex" এই সাজানোর একটি ভাল উদাহরণ খুঁজে পাওয়া যেতে পারে এই উত্তর এবং এই এক । এগুলি ব্যাকরণ সংক্রান্ত ঘোষণার মতো দেখতে অনেক বেশি লাগে।
পরেরটি আপনাকে স্মরণ করিয়ে দেয়:
… লাইন ‐ শব্দ নিদর্শনগুলি কখনই লিখবেন না তা নিশ্চিত করুন। আপনার দরকার নেই, এবং আপনার করা উচিত নয়। এমন কোনও প্রোগ্রামিং ল্যাঙ্গুয়েজ রক্ষণযোগ্য হতে পারে না যা সাদা স্থান, মন্তব্য, সাবরুটাইনস বা আলফানিউমেরিক সনাক্তকারীকে নিষেধ করে। সুতরাং এই সমস্ত জিনিস আপনার নিদর্শন ব্যবহার করুন।
এটি অতিরিক্ত জোর দেওয়া যায় না। অবশ্যই যদি আপনি সেই জিনিসগুলি আপনার নিদর্শনগুলিতে ব্যবহার না করেন তবে আপনি প্রায়শই একটি দুঃস্বপ্ন তৈরি করবেন। কিন্তু আপনি যদি না তাদের ব্যবহার, যদিও, তাই না প্রয়োজন।
এখানে আধুনিক ব্যাকরণগত প্যাটার্নের আরও একটি উদাহরণ, আরএফসি 5322 পার্স করার জন্য এটি একটি: ব্যবহার করুন 5.10.0;
$rfc5322 = qr{
(?(DEFINE)
(?<address> (?&mailbox) | (?&group))
(?<mailbox> (?&name_addr) | (?&addr_spec))
(?<name_addr> (?&display_name)? (?&angle_addr))
(?<angle_addr> (?&CFWS)? < (?&addr_spec) > (?&CFWS)?)
(?<group> (?&display_name) : (?:(?&mailbox_list) | (?&CFWS))? ; (?&CFWS)?)
(?<display_name> (?&phrase))
(?<mailbox_list> (?&mailbox) (?: , (?&mailbox))*)
(?<addr_spec> (?&local_part) \@ (?&domain))
(?<local_part> (?&dot_atom) | (?"ed_string))
(?<domain> (?&dot_atom) | (?&domain_literal))
(?<domain_literal> (?&CFWS)? \[ (?: (?&FWS)? (?&dcontent))* (?&FWS)?
\] (?&CFWS)?)
(?<dcontent> (?&dtext) | (?"ed_pair))
(?<dtext> (?&NO_WS_CTL) | [\x21-\x5a\x5e-\x7e])
(?<atext> (?&ALPHA) | (?&DIGIT) | [!#\$%&'*+-/=?^_`{|}~])
(?<atom> (?&CFWS)? (?&atext)+ (?&CFWS)?)
(?<dot_atom> (?&CFWS)? (?&dot_atom_text) (?&CFWS)?)
(?<dot_atom_text> (?&atext)+ (?: \. (?&atext)+)*)
(?<text> [\x01-\x09\x0b\x0c\x0e-\x7f])
(?<quoted_pair> \\ (?&text))
(?<qtext> (?&NO_WS_CTL) | [\x21\x23-\x5b\x5d-\x7e])
(?<qcontent> (?&qtext) | (?"ed_pair))
(?<quoted_string> (?&CFWS)? (?&DQUOTE) (?:(?&FWS)? (?&qcontent))*
(?&FWS)? (?&DQUOTE) (?&CFWS)?)
(?<word> (?&atom) | (?"ed_string))
(?<phrase> (?&word)+)
# Folding white space
(?<FWS> (?: (?&WSP)* (?&CRLF))? (?&WSP)+)
(?<ctext> (?&NO_WS_CTL) | [\x21-\x27\x2a-\x5b\x5d-\x7e])
(?<ccontent> (?&ctext) | (?"ed_pair) | (?&comment))
(?<comment> \( (?: (?&FWS)? (?&ccontent))* (?&FWS)? \) )
(?<CFWS> (?: (?&FWS)? (?&comment))*
(?: (?:(?&FWS)? (?&comment)) | (?&FWS)))
# No whitespace control
(?<NO_WS_CTL> [\x01-\x08\x0b\x0c\x0e-\x1f\x7f])
(?<ALPHA> [A-Za-z])
(?<DIGIT> [0-9])
(?<CRLF> \x0d \x0a)
(?<DQUOTE> ")
(?<WSP> [\x20\x09])
)
(?&address)
}x;
এটি কি উল্লেখযোগ্য - এবং দুর্দান্ত নয়? আপনি একটি বিএনএফ-স্টাইলের ব্যাকরণ নিতে পারেন এবং এর মৌলিক কাঠামোটি না হারিয়ে এটিকে সরাসরি কোডে অনুবাদ করতে পারেন!
যদি আধুনিক ব্যাকরণগত নিদর্শনগুলি এখনও আপনার পক্ষে পর্যাপ্ত না হয় তবে ড্যামিয়ান কনওয়ের উজ্জ্বল Regexp::Grammars
মডিউলটি এমনকি উচ্চতর ডিবাগিংয়ের সাথে একটি এমনকি ক্লিনার সিনট্যাক্সও সরবরাহ করে। আরএফসি 5322 রিস্টাস্টটি সেই মডিউল থেকে কোনও প্যাটার্নে পার্স করার জন্য এখানে একই কোডটি রয়েছে:
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Data::Dumper "Dumper";
my $rfc5322 = do {
use Regexp::Grammars; # ...the magic is lexically scoped
qr{
# Keep the big stick handy, just in case...
# <debug:on>
# Match this...
<address>
# As defined by these...
<token: address> <mailbox> | <group>
<token: mailbox> <name_addr> | <addr_spec>
<token: name_addr> <display_name>? <angle_addr>
<token: angle_addr> <CFWS>? \< <addr_spec> \> <CFWS>?
<token: group> <display_name> : (?:<mailbox_list> | <CFWS>)? ; <CFWS>?
<token: display_name> <phrase>
<token: mailbox_list> <[mailbox]> ** (,)
<token: addr_spec> <local_part> \@ <domain>
<token: local_part> <dot_atom> | <quoted_string>
<token: domain> <dot_atom> | <domain_literal>
<token: domain_literal> <CFWS>? \[ (?: <FWS>? <[dcontent]>)* <FWS>?
<token: dcontent> <dtext> | <quoted_pair>
<token: dtext> <.NO_WS_CTL> | [\x21-\x5a\x5e-\x7e]
<token: atext> <.ALPHA> | <.DIGIT> | [!#\$%&'*+-/=?^_`{|}~]
<token: atom> <.CFWS>? <.atext>+ <.CFWS>?
<token: dot_atom> <.CFWS>? <.dot_atom_text> <.CFWS>?
<token: dot_atom> <.CFWS>? <.dot_atom_text> <.CFWS>?
<token: dot_atom_text> <.atext>+ (?: \. <.atext>+)*
<token: text> [\x01-\x09\x0b\x0c\x0e-\x7f]
<token: quoted_pair> \\ <.text>
<token: qtext> <.NO_WS_CTL> | [\x21\x23-\x5b\x5d-\x7e]
<token: qcontent> <.qtext> | <.quoted_pair>
<token: quoted_string> <.CFWS>? <.DQUOTE> (?:<.FWS>? <.qcontent>)*
<.FWS>? <.DQUOTE> <.CFWS>?
<token: word> <.atom> | <.quoted_string>
<token: phrase> <.word>+
# Folding white space
<token: FWS> (?: <.WSP>* <.CRLF>)? <.WSP>+
<token: ctext> <.NO_WS_CTL> | [\x21-\x27\x2a-\x5b\x5d-\x7e]
<token: ccontent> <.ctext> | <.quoted_pair> | <.comment>
<token: comment> \( (?: <.FWS>? <.ccontent>)* <.FWS>? \)
<token: CFWS> (?: <.FWS>? <.comment>)*
(?: (?:<.FWS>? <.comment>) | <.FWS>)
# No whitespace control
<token: NO_WS_CTL> [\x01-\x08\x0b\x0c\x0e-\x1f\x7f]
<token: ALPHA> [A-Za-z]
<token: DIGIT> [0-9]
<token: CRLF> \x0d \x0a
<token: DQUOTE> "
<token: WSP> [\x20\x09]
}x;
};
while (my $input = <>) {
if ($input =~ $rfc5322) {
say Dumper \%/; # ...the parse tree of any successful match
# appears in this punctuation variable
}
}
সেখানে ভাল কাপড় অনেক perlre র manpage কিন্তু মৌলিক Regex ডিজাইন বৈশিষ্ট্য এই চমকপ্রদ উন্নতি কোন মানে একা পার্ল সীমাবদ্ধ দ্বারা হয়। প্রকৃতপক্ষে pcrepattern র manpage একটি সহজ পাঠ করা, এবং একই এলাকা জুড়ে পারে।
আপনার নিখরচায় অটোমেটা ক্লাসে শেখানো আদিম জিনিসগুলির সাথে আধুনিক নিদর্শনগুলির প্রায় কোনও মিল নেই।