নিয়মিত প্রকাশ এত বিতর্কিত কেন? [বন্ধ]


212

নিয়মিত অভিব্যক্তিগুলি অন্বেষণ করার সময় (অন্যথায় RegEx-es হিসাবে পরিচিত), এমন অনেক ব্যক্তি আছেন যারা নিয়মিত প্রকাশকে পবিত্র গ্রিল হিসাবে দেখেন বলে মনে হয়। এমন কিছু যা দেখতে জটিল দেখায় - অবশ্যই যে কোনও প্রশ্নের উত্তর হতে হবে। তারা ভাবেন যে নিয়মিত এক্সপ্রেশন ব্যবহার করে প্রতিটি সমস্যা সমাধানযোগ্য।

অন্যদিকে, এমন অনেক লোক আছেন যাঁরা বিনা ব্যয়ে নিয়মিত প্রকাশ এড়াতে চেষ্টা করেন। তারা নিয়মিত প্রকাশের জন্য কোনও উপায় অনুসন্ধান করার চেষ্টা করে এবং কেবল এটির জন্য অতিরিক্ত কোডিং গ্রহণ করে, এমনকি যদি নিয়মিত প্রকাশগুলি আরও কমপ্যাক্ট সমাধান হয়।

নিয়মিত প্রকাশকে এত বিতর্কিত হিসাবে বিবেচনা করা হয় কেন? তারা কীভাবে কাজ করে সে সম্পর্কে কি বিভ্রান্তি রয়েছে? বা এটি একটি বিস্তৃত বিশ্বাস হতে পারে যে নিয়মিত প্রকাশগুলি সাধারণত ধীর হয়?


9
যদি এটি আলোচনা হয়, তবে এটি বন্ধ করা উচিত নয়? তবে আমি সেখানে একটি বাস্তব প্রশ্ন দেখতে পাচ্ছি তাই সম্ভবত আলোচনার ট্যাগটি অন্তর্ভুক্ত নয়?
আরসিআইএক্স

6
দুষ্টুমি করসি না. আপনি এটি এনেছেন এবং লোকেরা এখানে প্রায় পাগল হতে শুরু করে।
রায়ান ফ্লোরেন্স

1
প্রশ্নে চমৎকার পর্যবেক্ষণ ও শব্দবন্ধ!
ইম্জ - ইভান জ্যাকারিয়াশ্চ শেভ


প্রশ্নটি হল মতামত ভিত্তিক বিধিটি এখানেও প্রয়োগ করা উচিত (বা একটি সুনির্দিষ্ট উত্তর লক্ষ্য করার জন্য প্রশ্নটি সম্পাদনা করা উচিত)। এটি বলেছিল যে আমি অনুমান করেছি যে রেজেক্স বিপরীতটি সম্পর্কে টিউটোরিয়াল এবং ম্যানুয়ালগুলির অন-নির্ভুলতা থেকে আসে from বেশিরভাগ সময় না থাকলে সমস্ত সময়ের তথ্য মিশ্রিত হয় এবং অতিরিক্তভাবে আমাদের সমস্ত বৈশিষ্ট্য দেওয়া হয় না। সেই ভাষা মিস ব্যবহারের সাথে যুক্ত করুন, আপনি রাস্তায় লক্ষ্য রাখতে কিছু শেখার শেষ করেছেন যা এর অর্থ অন্যরকম হতে পারে। এবং অবশেষে বিশেষ রেজেক্স অক্ষরগুলি একটি অর্থের মধ্যে সীমাবদ্ধ নয় যা আরও বিভ্রান্তি যোগ করে।
ইনটিকা

উত্তর:


136

আমি মনে করি না লোকেরা নিয়মিত প্রকাশে আপত্তি জানায় কারণ তারা মন্থর, বরং তারা পড়তে এবং লিখতে যেমন শক্ত হয় ঠিক তেমনি সঠিক হওয়ার পক্ষেও কঠিন। কিছু পরিস্থিতি রয়েছে যেখানে নিয়মিত প্রকাশগুলি সমস্যার কার্যকর ও সংক্ষিপ্ত সমাধান সরবরাহ করে, কখনও কখনও সেগুলি এমন পরিস্থিতিতে পরিচ্ছন্ন করা হয় যেখানে পরিবর্তে সহজেই পড়ার, কোডের বজায় রাখা যায় এমন বিভাগটি ব্যবহার করা আরও ভাল।


2
এবং হ্যাঁ, সাধারণ ফাংশন ব্যবহারের তুলনায় রেজেক্সেসগুলি অত্যন্ত চরম ধীর হতে পারে। আর মাত্র ধীর কিন্তু Regex ইঞ্জিন কর্মক্ষমতা হতে পারে সম্পূর্ণই অনিশ্চিত যখন নির্বিচারে (ব্যবহারকারী-সরবরাহকৃত) ইনপুট সঙ্গে মুখোমুখি হন।
পেসারিয়ার 21

1
আপনি যদি জানেন কীভাবে রেজেক্স কাজ করে, এটি মোটেই সমস্যা নয়।
শিপলু মোকাদ্দিম

8
@ পেসারিয়ার, এটি ধীর ধরণের নয় , এটি ধীর ইঞ্জিনগুলি । বেশিরভাগ (আধুনিক) নিয়মিত এক্সপ্রেশন ইঞ্জিনগুলি জটিল নিদর্শনগুলির জন্য অনুপযুক্ত (যেমন অনেকগুলি |বা .*), কারণ তারা স্ট্যাক মেশিন এবং ব্যাকট্র্যাকিং ব্যবহার করে। এজন্য আপনাকে পার্ল, জাভা, পাইথন, রুবিতে আপনার নিয়মিত এক্সপ্রেশনগুলি সাবধানতার সাথে টিউন করতে হবে ... পুরানো স্টাইলের নিয়মিত এক্সপ্রেশন ইঞ্জিনগুলি ( grepউদাহরণস্বরূপ) প্রথমে ডিএফএ-তে প্যাটার্নটি সংকলন করুন। এরপরে, প্যাটার্নটির জটিলতা মূলত অপ্রাসঙ্গিক। আমি ঠিক একই পাঠ্য এবং প্যাটার্নটির জন্য জাভা এবং গ্রেপ ব্যবহার করেছি: 22 মিনিট বনাম 2 এস। বিজ্ঞানটি
হেজেলো

122

রেগেক্সগুলি রক্ষণাবেক্ষণযোগ্য করে তোলা

পূর্বে "নিয়মিত অভিব্যক্তি" হিসাবে বর্ণিত নিদর্শনগুলিকে নির্মূল করার দিকে অগ্রণী অগ্রাধিকার হ'ল পার্লের /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) | (?&quoted_string))
     (?<domain>          (?&dot_atom) | (?&domain_literal))
     (?<domain_literal>  (?&CFWS)? \[ (?: (?&FWS)? (?&dcontent))* (?&FWS)?
                                   \] (?&CFWS)?)
     (?<dcontent>        (?&dtext) | (?&quoted_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) | (?&quoted_pair))
     (?<quoted_string>   (?&CFWS)? (?&DQUOTE) (?:(?&FWS)? (?&qcontent))*
                          (?&FWS)? (?&DQUOTE) (?&CFWS)?)

     (?<word>            (?&atom) | (?&quoted_string))
     (?<phrase>          (?&word)+)

     # Folding white space
     (?<FWS>             (?: (?&WSP)* (?&CRLF))? (?&WSP)+)
     (?<ctext>           (?&NO_WS_CTL) | [\x21-\x27\x2a-\x5b\x5d-\x7e])
     (?<ccontent>        (?&ctext) | (?&quoted_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 একটি সহজ পাঠ করা, এবং একই এলাকা জুড়ে পারে।

আপনার নিখরচায় অটোমেটা ক্লাসে শেখানো আদিম জিনিসগুলির সাথে আধুনিক নিদর্শনগুলির প্রায় কোনও মিল নেই।


9
হ্যাঁ! হ্যাঁ! পরিশেষে, কেউ এক্স মোডিফায়ারের সাথে কীভাবে পঠনযোগ্য রেজেক্সগুলি থাকতে পারে তার দুর্দান্ত উদাহরণ দেখায়। আমি বিশ্বাস করতে পারি না যে কত কম লোক জানেন যে এটি বিদ্যমান, বাস্তবে এটি ব্যবহার করা যাক।
শাবিরোব

1
@ শ্যাববিরোব: এটি ঠিক নয় /x। এটি (?&name)অভ্যন্তরীণ রেজেক্সেক্স সাবরুটাইনগুলির সাথে ব্যাকরণগতভাবে রেজিক্সগুলি ব্যবহার করছে , যা সত্যই এই আলোকিত করে।
tchrist

+1 আপনি সর্বদা নতুন কিছু শিখেন। আমি জানতাম না যে পিসিআরই সংজ্ঞায়িত করার জন্য "মিথ্যা" শর্ত রয়েছে।
নিকিসি

5
পাইথন একইভাবে একটি re.VERBOSEপতাকা আছে।
যান্ত্রিক শামুক 6

3
কেবল গুনা এগিয়ে যান এবং বলুন যে আমি এখনও জনগণকে রেজেক্সকে ব্যবহারযোগ্য করে তোলার জন্য যে দৈর্ঘ্যে যাব তা শুনে অবাক হয়েছি।
স্লেটার ভিক্টোরফ

68

রেজেক্সেস একটি দুর্দান্ত সরঞ্জাম, তবে লোকেরা "আরে, কী দুর্দান্ত সরঞ্জাম, আমি এক্স করতে এটি ব্যবহার করব!" যেখানে এক্স এমন একটি জিনিস যা এর জন্য আলাদা আলাদা সরঞ্জাম ভাল (সাধারণত পার্সার)। এটি একটি হাতুড়ি ব্যবহার করে স্ট্যান্ডার্ড যেখানে আপনার কোনও স্ক্রু ড্রাইভারের সমস্যা প্রয়োজন।


4
কেবল মনে রাখবেন যে বেশিরভাগ পার্সার-অলৌকিক বিশ্লেষক- এখনও তাদের জিনিসপত্র বিশ্লেষণের জন্য নিয়মিত অভিব্যক্তি ব্যবহার করেন :-)
জ্যাস্পার বেকার্স

62
পার্সাররা নিয়মিত এক্সপ্রেশন ব্যবহার করে তা বলা পার্সাররা অ্যাসাইনমেন্ট স্টেটমেন্ট ব্যবহার করার মতো। সেগুলি কীভাবে ব্যবহার হচ্ছে তা আপনি যতক্ষণ না তাকান ততক্ষণ এর অর্থ কিছুই না।
চস ওয়েন্স

24
কোনও পার্সার যখন ভাল হয় তখন একটি রেজিএক্স ব্যবহার করা বিরক্তিকর। ভাষার স্ট্যান্ডার্ড স্ট্রিংগুলি ফাংশনগুলি সন্ধান বা প্রতিস্থাপনের সময় একটি রেজিএক্স ব্যবহার করা কার্যকর হবে (এবং সাধারণত লিনিয়ার সময়ে) কেবল অমার্জনীয়।
jmucchiello

1
সম্মত, কারণ একটি রেজিএক্স হ'ল এটির ওভারহেড প্রক্রিয়াজাতকরণের সমস্ত ব্যবসায়ের একটি জ্যাক হতে হবে be একটি রেজিএক্স ইঞ্জিন ব্যবহার করা সহজ বলে মনে হচ্ছে কেবল এটি একটি পুনরাবৃত্ত পার্সার (বিকাশকারী উপর নির্ভরশীল প্রান্তিক) এর চেয়ে ভাল সমাধান নয়। আমার প্রিয় উদাহরণগুলির মধ্যে একটি পিএইচপি এর split($pattern,$string)বনাম explode($delimiter,$string)- শুকরিয়া প্রাক্তন হ্রাস পেয়েছে, তবে প্রচুর কোড প্রাক্তনটি ব্যবহার করেছে যখন তাদের কেবলমাত্র পরবর্তী শক্তি প্রয়োজন। সম্মত, RegEx গুলি কিছু কাজ করার একটি সহজ সরঞ্জাম সরবরাহ করে তবে যদি না আপনি নিয়মিত প্রকাশের সম্পূর্ণ শক্তির প্রয়োজন হয় সেগুলি
Rudu

4
লেক্সিকাল বিশ্লেষকরা প্রকৃতপক্ষে রিজেক্সগুলি ব্যবহার করতে পারেন। এগুলি টোকেনাইজার হিসাবেও পরিচিত, তবে তারা সিনট্যাকটিক বিশ্লেষক (বা পার্সার) নয়। একটি জটিল পর্যাপ্ত স্ট্রিং পড়ার জন্য, টোকেনাইজারটি টোকেন হিসাবে স্ট্রিংটি পড়ার জন্য ব্যবহার করা উচিত (সম্ভবত টোকেনাইজারের উপর ভিত্তি করে রেজিক্সস, সম্ভবত নয়)। এর পরে এই টোকেনগুলি পার্সারে পাঠানো উচিত, যা তাদের ব্যাকরণের নিয়মগুলির সাথে প্রসেস করবে, যা অবশ্যই রেজিজেস নয়।
অ্যাক্সেল

53

নিয়মিত প্রকাশগুলি যিনি নিয়মিত ব্যবহার করেন (পাং উদ্দেশ্যে) আমি প্রায় সবাই জানি ইউনিক্স-ইশ ব্যাকগ্রাউন্ড থেকে আসে যেখানে তারা এমন সরঞ্জামগুলি ব্যবহার করে যা আরআরএসকে প্রথম শ্রেণির প্রোগ্রামিং কনস্ট্রাক্ট হিসাবে বিবেচনা করে, যেমন গ্রেপ, সেড, আর্ক এবং পার্ল। যেহেতু নিয়মিত ভাব প্রকাশের জন্য প্রায় কোনও সিনট্যাকটিক ওভারহেড নেই, তাই তারা যখন করে তখন তাদের উত্পাদনশীলতা বাড়িয়ে তোলে।

বিপরীতে, প্রোগ্রামাররা যারা ভাষাগুলি ব্যবহার করেন যাগুলিতে আরইগুলি একটি বাহ্যিক গ্রন্থাগার সেগুলি নিয়মিত প্রকাশ কীভাবে টেবিলে আনতে পারে তা বিবেচনা করে না। প্রোগ্রামার "সময়-ব্যয়" এতটাই বেশি যে হয় ক) আরইগুলি কখনই তাদের প্রশিক্ষণের অংশ হিসাবে উপস্থিত হয় না, বা খ) তারা আরইএসের ক্ষেত্রে "চিন্তা" করে না এবং আরও পরিচিত নিদর্শনগুলিতে ফিরে যেতে পছন্দ করে।


11
হ্যাঁ, আমি লাইব্রেরি ব্যবহার করে রেজেক্স সিনট্যাক্স ভারবোজ তৈরি করার জন্য পাইথনকে কখনও ভুলিনি। আমি মনে করি এটি পবিত্রতার চেয়ে বিশুদ্ধতা urity
পিছলে

7
আমি একটি ইউনিক্স ব্যাকগ্রাউন্ড থেকে এসেছি, সেড, অ্যাজক এবং পার্ল বোঝা ব্যবহৃত হয়েছি এবং অবশ্যই প্রচুর গ্রেপিং করেছি, তবে জেনে রাখুন যে আমি যখন একটি রেইজেক্স ব্যবহার করি তখন এটি কেবল লেখার হ্যাক যা আমি বজায় রাখতে পছন্দ করি না। এটি শেল স্ক্রিপ্ট / এক-টাইমারদের জন্য ভাল তবে সত্যিকারের কাজের জন্য, কেবলমাত্র কিছু-সংরক্ষণ করার জন্য ডেটা-রইল না এমন কিছু জন্য, আমি এখন স্পষ্ট বাক্য গঠন সহ একটি সঠিক টোকেনাইজার / লেক্সার / পার্সার ব্যবহার করি। আমার প্রিয়গুলি সমস্ত / যে কোনওটি করে, পরিষ্কারভাবে + স্ব-অনুকূলিত করতে পারে। আমি কঠোর উপায়ে এবং বেশ কয়েক বছর ধরে শিখেছি যে শুরুতে কিছুটা স্ব-শৃঙ্খলা মানেই পরে কম প্রচেষ্টা করা। একটি রেজেক্স হ'ল কীবোর্ডের একটি মুহুর্ত এবং ভ্রূণের উপরে একটি জীবনকাল।
অ্যান্ড্রুসি

44

নিয়মিত এক্সপ্রেশন আপনাকে ইনপুটটির স্ট্রিং প্রক্রিয়া করার জন্য একটি কমপ্যাক্ট উপায়ে একটি কাস্টম সসীম-রাষ্ট্রীয় মেশিন (এফএসএম) লিখতে দেয়। কমপক্ষে দু'টি কারণ রয়েছে যা নিয়মিত প্রকাশ করা শক্ত হয়:

  • ওল্ড-স্কুল সফ্টওয়্যার বিকাশ অনেক পরিকল্পনা, কাগজ মডেল এবং যত্নশীল চিন্তা জড়িত। নিয়মিত ভাবগুলি এই মডেলের সাথে খুব ভাল ফিট করে, কারণ কার্যকরভাবে প্রকাশের জন্য সঠিকভাবে লেখার জন্য এটির দিকে তাকাতে, এফএসএমের পথগুলিকে ভিজ্যুয়ালাইজ করা খুব জড়িত।

    আধুনিক সফ্টওয়্যার বিকাশকারীরা কোডটি বেশ হাতুড়ি দিয়ে বেরিয়েছিল এবং কোডটি সঠিক কিনা তা দেখার জন্য নির্বাহের মাধ্যমে পদক্ষেপ নিতে একটি ডিবাগার ব্যবহার করবে। নিয়মিত প্রকাশগুলি এই কার্যকরী শৈলীটি খুব ভালভাবে সমর্থন করে না। একটি নিয়মিত প্রকাশের একটি "রান" কার্যকরভাবে একটি পারমাণবিক অপারেশন। কোনও ডিবাগারে ধাপে ধাপে কার্যকর করা কঠিন।

  • নিয়মিত ভাব প্রকাশ করা খুব সহজ যা ঘটনাক্রমে আপনার ইচ্ছার চেয়ে বেশি ইনপুট গ্রহণ করে। একটি নিয়মিত অভিব্যক্তির মানটি সত্যই বৈধ ইনপুটটির সাথে মেলে না, এটি অবৈধ ইনপুটটির সাথে ব্যর্থ হতে পারে । নিয়মিত প্রকাশের জন্য "নেতিবাচক পরীক্ষা" করার কৌশলগুলি খুব উন্নত নয়, বা কমপক্ষে বহুল ব্যবহৃত হয় না।

    এটি নিয়মিত প্রকাশের পক্ষে পড়া শক্ত হয়ে ওঠে। কেবল একটি নিয়মিত অভিব্যক্তি দেখে, সম্ভাব্য সমস্ত ইনপুটগুলি প্রত্যাখ্যান করা উচিত তা ভিজ্যুয়ালাইজ করতে অনেক ঘনত্ব লাগে, তবে ভুলভাবে গ্রহণ করা হয়। অন্যের নিয়মিত প্রকাশের কোডটি কখনও ডিবাগ করার চেষ্টা করবেন ?

আজ যদি সফ্টওয়্যার বিকাশকারীদের মধ্যে নিয়মিত ভাব প্রকাশের বিরুদ্ধে প্রতিরোধের উপস্থিতি থাকে তবে আমি মনে করি এটি মূলত এই দুটি কারণের কারণে।


4
রিজেক্সপস ডিবাগ করার জন্য দুর্দান্ত সরঞ্জামগুলি রয়েছে: regexbuddy.com
জ্যাস্পার

15
perl -Mre = debug -e "q [aabbcc] = ~ / ab * [সিডি] /"
ব্র্যাড গিলবার্ট

15
আমি মনে করি না যে আমি কখনই ফ্লাইং স্প্যাগেটি মনস্টারটির কথা চিন্তা না করে "এফএসএম" সংক্ষিপ্ত বিবরণ দেখতে পাব।
শাবিরোব

4
@ শ্যাববাইরোব: আমার আপত্তি করার অর্থ নেই। আপনি যদি চান, আপনি ডিস্ট্রিমেন্টিক সসীম অটোমেটন (ডিএফএ) ব্যবহার করতে পারেন।
বিল কারভিন

37

লোকেরা নিয়মিত ভাব প্রকাশ করা শক্ত বলে মনে করেন; তবে এ কারণেই তারা তাদের ভুল ব্যবহার করছে। কোনও মন্তব্য, ইনডেন্টিং বা নামকরণ ক্যাপচার ছাড়াই জটিল ওয়ান-লাইনারগুলি লেখা। (আপনি আপনার জটিল এসকিউএল এক্সপ্রেশনটি এক লাইনে, মন্তব্য, ইনডেন্টিং বা এলিয়াস ছাড়াই ক্র্যাম করবেন না?)। তাই হ্যাঁ, অনেক লোকের জন্য, তারা বোঝায় না।

তবে, যদি আপনার কাজের পাঠ্যকে পার্সিংয়ের সাথে কিছু করতে থাকে (প্রায় কোনও ওয়েব অ্যাপ্লিকেশন সেখানে রয়েছে ...) এবং আপনি নিয়মিত প্রকাশটি জানেন না, আপনি নিজের কাজটি স্তন্যপান করেন এবং আপনি নিজের সময় এবং আপনার সময় নষ্ট করছেন নিয়োগকর্তা। সেগুলি সম্পর্কে আপনাকে সমস্ত কিছু শেখানোর জন্য এখানে দুর্দান্ত উত্স রয়েছে যা আপনার আরও জানা দরকার এবং আরও অনেক কিছু।


2
ঠিক আছে .. পার্থক্যটি হ'ল রেগেক্সে একাধিক স্পেসের অর্থ রয়েছে, যেখানে অন্য ভাষাগুলিতে তারা তা করে না এবং সে কারণেই তারা সাধারণত একটি লাইনার থাকে (যেটি কখনও কখনও একাধিক লাইনে আবৃত থাকে :)
রেডো

14
@ র্যাডো: পার্লের উদাহরণস্বরূপ, xরেজেক্সেসগুলির জন্য মডিফায়ার রয়েছে যা হোয়াইটস্পেসকে অগ্রাহ্য করার কারণ করে। এটি আপনাকে কয়েকটি লাইনে রেজেক্স স্থাপন করতে এবং মন্তব্যগুলি যুক্ত করতে দেয়।
নাথান ফেলম্যান

9
তেমনি পাইথনও re.Xওরফে আছে re.VERBOSE
ক্রেগ ম্যাককুইন

2
অনুরূপভাবে xTCL মধ্যে পরিবর্তক। আমি বিশ্বাস করি যে টিসিএল, অন্য ভাষার মতো নয়, এটি পিসিআরই ব্যবহার করে না quite
slebetman

2
@ অ্যান্ড্রুসি এই পোষ্টটি অর্জন করতে পারত এমন একটি গুরুতর ভুল ব্যাখ্যা।
জ্যাস্পার বেকার্স

28

কারণ তাদের কাছে সাধারণভাবে গৃহীত আইডিইগুলিতে সর্বাধিক জনপ্রিয় শেখার সরঞ্জামের অভাব রয়েছে: রেগেক্স উইজার্ড নেই। এমনকি অটোকম্প্লেশনও নয়। আপনাকে নিজেরাই পুরো জিনিসটি কোড করতে হবে।


3
তারপরে আপনি ভুল আইডিই ব্যবহার করছেন ... এমনকি আমার পাঠ্য সম্পাদকটিও রেগেক্স ইঙ্গিত সরবরাহ করে।
কার্টেনডগ

1
পার্শ্ব নোটে, এক্সপ্রেসো এবং দ্য রেজেক্স কোচ নিয়মিত ভাব প্রকাশের জন্য খুব দরকারী সরঞ্জাম tools
মুন

22
বিশ্বে আপনি কীভাবে একটি নিয়মিত অভিব্যক্তি স্বয়ংক্রিয়ভাবে পূর্ণ করবেন?
অ্যামব্রোস চ্যাপেল

3
এডিটপ্যাড প্রোতে বাক্সে রেগেক্সগুলির জন্য সিনট্যাক্স হাইলাইট করা আছে তবে আমি এটি সহায়কের চেয়ে বেশি বিরক্তিকর বলে মনে করি এবং এটি বন্ধ করে রাখি। আমি যখন তুলনাহীন বন্ধনী রাখি তখন আমাকে তা জানানোর জন্য আমি তার প্রশংসা করি; বিশেষত বন্ধনীগুলি ট্র্যাক রাখার জন্য ভালুক হতে পারে।
অ্যালান মুর

2
@ অ্যামব্রোস চ্যাপেল - আমি এই আলোচনার জন্য কয়েক বছর দেরি করেছি। তবে আমি regexhero.net/tester এ একটি অটোকম্প্লিপশন মেকানিজম তৈরি করেছি, এটি বৃত্তাকার (), বর্গক্ষেত্র []বা কোঁকড়ানো {}বন্ধনীগুলির মধ্যে সাধারণ নির্মাণগুলি দ্বারা সূচিত হয়েছিল । এটি ব্যাকস্ল্যাশ থেকে দূরে কাজ করবে।
স্টিভ ওয়ার্থহাম

17

" নিয়মিত এক্সপ্রেশন: এখন আপনার দুটি সমস্যা আছে " বিষয়টি নিয়ে জেফ আতউডের একটি দুর্দান্ত নিবন্ধ। মূলত, নিয়মিত এক্সপ্রেশন "শক্ত"! তারা নতুন সমস্যা তৈরি করতে পারে। এগুলি অবশ্য কার্যকর।


16

আমি মনে করি না তারা এগুলি বিতর্কিত।

আমি এটাও মনে করি আপনি নিজের প্রশ্নের উত্তর একরকম দিয়েছেন, কারণ আপনি সর্বত্র এগুলি ব্যবহার করা কত নির্বোধ হবে তা নির্দেশ করেছেন ( সবকিছুই একটি নিয়মিত ভাষা নয় 2) ) বা এগুলিকে ব্যবহার করা এড়াতে হবে। আপনাকে, প্রোগ্রামার, নিয়মিত এক্সপ্রেশন কোডটি কখন সহায়তা করবে বা ক্ষতি করবে সে সম্পর্কে একটি বুদ্ধিমান সিদ্ধান্ত নিতে হবে। যখন এই জাতীয় সিদ্ধান্তের মুখোমুখি হন, তখন দুটি বিষয় মনে রাখবেন যা হ'ল রক্ষণাবেক্ষণযোগ্যতা (যা পঠনযোগ্যতা বোঝায়) এবং বর্ধনযোগ্যতা।

যাঁরা বিশেষত তাদের বিরুদ্ধ, তাদের আমার ধারণা হ'ল তারা এগুলি কখনই সঠিকভাবে ব্যবহার করতে শেখে নি। আমি মনে করি বেশিরভাগ লোকেরা যারা বেশ কয়েক ঘন্টা শালীন টিউটোরিয়ালের সাথে ব্যয় করেন তারা তাদের খুঁজে বের করবেন এবং খুব দ্রুত সাবলীল হয়ে উঠবেন। কোথায় শুরু করবেন তার জন্য এখানে আমার পরামর্শ:

http://docs.python.org/howto/regex

যদিও পৃষ্ঠাটি পাইথনের প্রসঙ্গে নিয়মিত প্রকাশের বিষয়ে কথা বলেছে তবে আমি খুঁজে পেয়েছি যে তথ্যটি অন্য কোথাও খুব প্রযোজ্য। পাইথন-নির্দিষ্ট কয়েকটি জিনিস রয়েছে তবে আমি বিশ্বাস করি সেগুলি স্পষ্টভাবে উল্লেখ করা হয়েছে, এবং মনে রাখা সহজ।


2
পৃষ্ঠাটি দেখে মনে হচ্ছে ডকস.প্যাথন.আর.
ডমিনিক কে

@ ডিএম ধন্যবাদ আমি আমার উত্তর প্রতিফলিত সম্পাদনা করব।
অ্যালিউরকোড

11

পাটিগণিত অপারেটরগণ সংখ্যার তুলনায় নিয়মিত প্রকাশগুলি হ'ল এবং আমি সেগুলি বিতর্কিত হিসাবে বিবেচনা করব না। আমি মনে করি এমনকি আমার মতো মোটামুটি এক মিলিস্ট্যান্ট ওও কর্মী (যিনি স্ট্রিংয়ের চেয়ে অন্যান্য বিষয় বেছে নেওয়ার প্রবণতা পোষণ করেছিলেন) তাদের প্রত্যাখ্যান করতে কঠোর চাপ দেওয়া হবে।


7

সমস্যাটি হ'ল রেজেক্সগুলি সম্ভাব্যভাবে এত শক্তিশালী যে আপনি তাদের সাথে এমন কিছু করতে পারেন যাতে আপনার জন্য আলাদা কিছু ব্যবহার করা উচিত।

কোনও ভাল প্রোগ্রামারকে এগুলি কোথায় ব্যবহার করতে হবে এবং কোথায় নয় তা জেনে রাখা উচিত। সাধারণ উদাহরণটি অ-নিয়মিত ভাষাগুলি পার্স করা হয় ( কোনও ভাষা নিয়মিত কিনা তা স্থির করে দেখুন )।

আমি মনে করি আপনি প্রথমে সত্যিকারের নিয়মিত অভিব্যক্তিগুলিতে (কোনও এক্সটেনশন নেই) সীমাবদ্ধ রাখলে আপনি ভুল হতে পারবেন না । কিছু এক্সটেনশানগুলি আপনার জীবনকে কিছুটা সহজ করে তুলতে পারে, তবে আপনি যদি সত্যিকারের রেজেক্স হিসাবে প্রকাশ করতে কিছু শক্ত মনে করেন তবে এটি সম্ভবত একটি ইঙ্গিত হতে পারে যে একটি রেজেক্স সঠিক সরঞ্জাম নয়।


5

গোটো কেন বিতর্কিত তা আপনি প্রায় জিজ্ঞাসা করতে পারেন।

মূলত, আপনি যখন এতটা "স্পষ্ট" শক্তি পান, লোকেরা তাদের জন্য খারাপ ব্যবহারের জন্য প্রস্তুত থাকে তারা তাদের জন্য সর্বোত্তম বিকল্প নয়। রেজিজেসগুলিতে সিএসভি বা এক্সএমএল বা এইচটিএমএল বিশ্লেষণ করতে বলার লোকের সংখ্যা, উদাহরণস্বরূপ, আমাকে অবাক করে। এটি কাজের জন্য ভুল সরঞ্জাম। তবে কিছু ব্যবহারকারী যেভাবেই রেজিক্সগুলি ব্যবহার করার জন্য জোর দিয়ে থাকেন।

ব্যক্তিগতভাবে, আমি সেই খুশির মাধ্যমটি সন্ধান করার চেষ্টা করি - তারা কী ভাল সে জন্য রেজিজেসগুলি ব্যবহার করুন এবং যখন তারা অনুকূলের চেয়ে কম হন তখন এড়ানো উচিত।

দ্রষ্টব্য যে রেজেক্সগুলি এখনও সিএসভি, এক্সএমএল, এইচটিএমএল ইত্যাদির বিশ্লেষণ করতে ব্যবহৃত হতে পারে তবে সাধারণত কোনও একক রেজেজেসে হয় না।


নিশ্চিত যে আপনি এই ফর্ম্যাটগুলির যে কোনও একটিকে একটি একক রেজেক্সে পার্স করতে পারবেন, এটাই রেজেক্সেসের শক্তি, বাবু! আপনি এটি করতে চান বা করবেন না, এটি সম্পূর্ণ আলাদা বিষয়।
জ্যাস্পার

4

আমি মনে করি না "বিতর্কিত" সঠিক শব্দ।

তবে আমি এমন অনেকগুলি উদাহরণ দেখেছি যেখানে লোকেরা বলে যে "এই জাতীয় এবং এই জাতীয় স্ট্রিং ম্যানিপুলেশন করার জন্য আমার নিয়মিত অভিব্যক্তি কী দরকার?" যা এক্সওয়াই সমস্যা।

অন্য কথায়, তারা এই ধারণা থেকে শুরু করেছে যে একটি রেজেক্স তাদের প্রয়োজন, তবে তারা পার্টের ট্র / রূপের মতো একটি অনুবাদ () এর সাথে একটি অনুবাদ দিয়ে আরও ভাল হতে পারে যেখানে অক্ষর একে অপরের জন্য প্রতিস্থাপন করা হয়, বা শুধু একটি সূচক ()।


4

এটি একটি আকর্ষণীয় বিষয়।
অনেক regexp ভক্তদের দক্ষতার সঙ্গে সূত্রের সংক্ষিপ্তকরনের গুলান বলে মনে হচ্ছে।
সর্বোপরি, একটি রেজিএক্সএক্সের জন্য প্রচুর চিন্তাভাবনা প্রয়োজন তার লেখককে প্রচুর তৃপ্তি তৈরি হয় যা এটিকে সরাসরি বৈধ করে তোলে।

তবে ... কর্মক্ষমতা কোনও সমস্যা না হলে রিজেক্সপসগুলি এত সুবিধাজনক এবং উদাহরণস্বরূপ পার্লে আপনাকে কোনও পাঠ্য আউটপুট নিয়ে দ্রুত ডিল করতে হবে। এছাড়াও, যখন পারফরম্যান্স হয় একটি বিষয় একজন সাদাসিধা অ্যালগরিদম বগী বা কম দক্ষ হতে পারে যে ব্যবহার করে regexp গ্রন্থাগার বীট চেষ্টা না পছন্দ হতে পারে।

এছাড়াও বেশ কয়েকটি কারণ রয়েছে যার জন্য রেগেক্সপসগুলি অন্যায়ভাবে সমালোচিত হয়, উদাহরণস্বরূপ

  • regexp কার্যকর নয়, কারণ শীর্ষটি তৈরি করা সুস্পষ্ট নয়
  • কিছু প্রোগ্রামার কেবল একবার "রেগ এক্সএক্স" বহুবার ব্যবহার করার জন্য (জাভায় স্ট্যাটিক প্যাটার্নের মতো) সংকলন করতে "ভুলে যান"
  • কিছু প্রোগ্রামার ট্রায়াল এবং ত্রুটি কৌশলটির জন্য যান - রিজেক্সপসের সাথে আরও কম কাজ করে!

4

আমি যা মনে করি রেজেক্স শিখছি এবং রেইগেক্স বজায় রাখা অজনপ্রিয় হয়, বেশিরভাগ বিকাশকারী অলস হয় বা তাদের বেশিরভাগই বাইরের লাইব্রেরিতে নির্ভর করে তাদের জন্য পার্সিং জিনিসটি করার জন্য ... তারা উত্তরটির জন্য গুগলে ভরসা করে এবং এমনকি ফোরামে জিজ্ঞাসা করে তাদের সমস্যার জন্য সম্পূর্ণ কোড। কিন্তু যখন একটি রেইজেক্স বাস্তবায়ন বা সংশোধন / রক্ষণাবেক্ষণ করতে আসে তারা কেবল ব্যর্থ হয়।

একটি জনপ্রিয় উক্তি আছে "বন্ধুরা এইচটিএমএল পার্সিংয়ের জন্য বন্ধুদেরকে রেগেক্স ব্যবহার করতে দেয় না"

তবে যতদূর আমি উদ্বিগ্ন আমি রেজেক্স ব্যবহার করে সম্পূর্ণ এইচটিএমএল পার্সার তৈরি করেছি এবং আমি আমার আত্ম খুঁজে পাই যে রেগেক্স এইচটিএমএল স্ট্রিংকে গতি-ভিত্তিক এবং স্মৃতি অনুসারে পার্সিংয়ের ক্ষেত্রে আরও ভাল (যদি আপনার কোনও ধারণা থাকে তবে আপনি কী অর্জন করবেন :))


2
আমি মনে করি এটি বেশিরভাগ বিকাশকারীকে ... অলস হিসাবে লেখার পক্ষে ক্ষমতাহীন। আমি বলব যে সিনট্যাক্সটি খুব গোপনীয়, অ-স্বজ্ঞাত এবং গোচাচায় পূর্ণ, অ-উদ্যোগিতদের কাছে, যা একটি উচ্চ বাধা-থেকে-প্রবেশের দিকে নিয়ে যায়। একই কারণে অনেকের কাছে পার্লের "খারাপ" খ্যাতি রয়েছে তবে এটি একটি খুব শক্তিশালী ভাষাও। এটি প্রতীকগুলি জানার আগে গাণিতিক ভাবগুলি পড়ার চেষ্টা করার মতো। এটি বিরক্তিকর, এবং বিকাশকারীদের তাদের সিনট্যাক্স শেখার জন্য সুবিধাগুলি পাবেন তা জানতে তাদের সময়ের সাথে বিচারিক হতে হবে।
ক্যাটাস্টিক ভয়েজ

আপনি এইচটিএমএল এ প্রান্তের মামলাগুলি মিস করবেন কারণ এইচটিএমএল কোনও নিয়মিত ভাষা নয়। আপনার অভিপ্রায়টি যদি এইচটিএমএল
বায়াং

2

নিয়মিত প্রকাশগুলি আমাকে সহ অনেক লোকের কাছে মারাত্মক রহস্য। এটি দুর্দান্ত কাজ করে তবে এটি গণিতের সমীকরণ দেখার মতো। যদিও আমি অবশেষে কেউ http://regexlib.com/ এ নিয়মিত প্রকাশের বিভিন্ন ক্রিয়াকলাপের একীভূত অবস্থান তৈরি করেছি তা জানাতে পেরে আমি খুশি । এখন যদি মাইক্রোসফ্ট কেবল একটি নিয়মিত অভিব্যক্তি ক্লাস তৈরি করে যা স্বয়ংক্রিয়ভাবে চিঠিগুলি বাদ দেওয়া, বা তারিখগুলি ফিল্টার করার মতো প্রচলিত জিনিসগুলি করে।


2
আপনি বিন্দু মিস করছি। রেজেক্সেসের ধারণাটি হ'ল আপনি সেগুলি শেখার জন্য কিছুটা সময় ব্যয় করেন এবং যখন আপনি শেষ করেন, আপনার আর কোনও জাদুকরী "পড়ার তারিখ" শ্রেণির প্রয়োজন নেই। পরিবর্তে, এটি তাদের জন্য খুব সামান্য প্রচেষ্টা রিজেেক্স লাগে। তদুপরি, "ymmy / mm / dd" এর জন্য একটি লিখতে যেমন সামান্য প্রচেষ্টা লাগবে তেমনি "মিমি-ডিডি-ইয়াই" বা একটি "মিমি-ইয়াদি / ডিডি" (যা জিতেছে) লিখতে লাগে 'টি প্রায়ই ঘটতে, কিন্তু এটা কিভাবে আপনি যে একটি ঐন্দ্রজালিক বর্গ কখনো করতে পারেন ") জিনিস করতে পারেন একটি উদাহরণ আছে।
জ্যাসপার

1

আমি নিয়মিত প্রকাশগুলি মাঝে মাঝে অমূল্য পাই। যখন আমার কিছু "अस्पष्ट" অনুসন্ধান করা দরকার এবং সম্ভবত এটি প্রতিস্থাপন করে। যখন ডেটা আলাদা হতে পারে এবং একটি নির্দিষ্ট এলোমেলো থাকতে পারে। যাইহোক, যখন আমাকে একটি সাধারণ অনুসন্ধান এবং প্রতিস্থাপন করা বা স্ট্রিংয়ের জন্য চেক করা দরকার তখন আমি নিয়মিত প্রকাশ প্রকাশ করি না। যদিও আমি অনেক লোককে জানি যারা এটি করে তবে তারা এটি সমস্ত কিছুর জন্য ব্যবহার করে। এটাই বিতর্ক।

আপনি যদি দেয়ালে একটি ট্যাক লাগাতে চান তবে হাতুড়ি ব্যবহার করবেন না। হ্যাঁ, এটি কাজ করবে তবে আপনি হাতুড়িটি পাওয়ার পরে আমি 20 টি প্রাচীরের মধ্যে রেখে দিতে পারি।

তারা যেগুলির জন্য ডিজাইন করা হয়েছিল তার জন্য নিয়মিত ভাব প্রকাশ করা উচিত এবং এর চেয়ে কম কিছুই নয়।


0

যদিও আমি মনে করি রেইজেক্সগুলি একটি প্রয়োজনীয় সরঞ্জাম, তবে তাদের সম্পর্কে সবচেয়ে বিরক্তিকর বিষয় হ'ল বিভিন্ন বাস্তবায়ন রয়েছে। সিনট্যাক্স, সংশোধক এবং বিশেষত - "লোভ" এর মধ্যে সামান্য পার্থক্য জিনিসকে সত্যই বিশৃঙ্খল করে তুলতে পারে, যার জন্য ট্রায়াল-অ্যান্ড-ত্রুটির প্রয়োজন হয় এবং কখনও কখনও ধাঁধা বাগ তৈরি করে।


রিজেক্স বাস্তবায়নগুলি কীভাবে সর্বাধিক মিলের দিকে তাদের দৃষ্টিভঙ্গিতে আলাদা হয়, যে জিনিসটি আমি আপনাকে "লোভ" বলছি বলে মনে হয়? আপনি কি বামে-দীর্ঘতম বনাম সবচেয়ে দীর্ঘ-বামতম শব্দার্থবিজ্ঞানের মধ্যে পার্থক্য বোঝাতে চান ? এটাই আমি জানি যে পার্থক্যটি; অর্থাত্ লোভ আগ্রহী হয় বা তদ্বিপরীত
tchrist

0

কিছু ক্ষেত্রে আমি মনে করি আপনি সেগুলি ব্যবহার করতে পারেন। উদাহরণস্বরূপ একটি লেক্সার তৈরি করা।

আমার মতে, এটি এমন লোকের দৃষ্টিভঙ্গি যাঁরা রেজিএক্সপ্যাক লিখতে পারেন এবং এমন লোকেরা (বা খুব কমই) লিখেন না। আমি ব্যক্তিগতভাবে বিষয়টিকে উদাহরণস্বরূপ কোনও ফর্মের ইনপুটটির বৈধতা দেওয়ার জন্য এটি একটি ভাল চিন্তাভাবনা, জাভাস্ক্রিপ্টে ব্যবহারকারীকে সতর্ক করতে বা সার্ভার-সাইড ভাষায় হোক।


0

আমি মনে করি এটি প্রোগ্রামারদের মধ্যে একটি কম পরিচিত প্রযুক্তি। সুতরাং, এটির জন্য বিস্তৃত গ্রহণযোগ্যতা নেই। এবং যদি আপনার কোডটি পর্যালোচনা করতে বা আপনার কাজ পর্যালোচনা করার জন্য কোনও প্রযুক্তিগত পরিচালক থাকে তবে একটি নিয়মিত প্রকাশ খুব খারাপ। আপনি একটি নিখুঁত নিয়মিত প্রকাশ লিখতে ঘন্টা ব্যয় করবেন এবং তিনি মডিউলটির জন্য কোডের কয়েকটি লাইন লিখেছেন ভেবে আপনি কয়েকটি চিহ্ন পাবেন। এছাড়াও, অন্য কোথাও যেমন বলা হয়েছে, নিয়মিত ভাব প্রকাশ করা খুব কঠিন কাজ।


1
নিয়মিত এক্সপ্রেশনগুলি পড়া কেবল তখনই কঠিন কাজ, যখন প্রোগ্রামার যিনি তাদের তৈরি করেছিলেন তারা হোয়াইট স্পেস, মন্তব্য, বর্ণানুক্রমিক শনাক্তকারী এবং সম্ভবত এম্বেড করা সাব্রোটাইনগুলি বিলম্বিত মৃত্যুর মাধ্যমে ব্যবহার করতে ব্যর্থ হন। সংক্ষেপে, সাধারণ প্রোগ্রামিংয়ে প্রযোজ্য সমস্ত সফ্টওয়্যার ইঞ্জিনিয়ারিং কৌশলগুলিও নিয়মিত অভিব্যক্তিতে অনুসরণ করা উচিত। যদি এই নীতিগুলি উপেক্ষা করা হয়, তবে লেখক পেশাদার কোড তৈরি করছেন না।
tchrist

আমি মনে করি আপনার ম্যানেজার জানেন না যে "প্রোগ্রামিংয়ের আসল নায়ক তিনিই নেতিবাচক কোড লেখেন।"
রাজীব 10

যদি আপনার ম্যানেজার যদি 3 টি লাইন কোড (রেজেক্সপস সহ) দিয়ে কাজটি সম্পন্ন করার জন্য আপনাকে ডিংগ করতে চলেছে, এমন কিছু ডুফাস সহকর্মীর প্রশংসা করার সময় যারা এটি এসেম্ব্লারের 900 লাইনে করেছেন ... আমি একটি নতুন কাজ সন্ধান করার পরামর্শ দিচ্ছি।
ফিল পেরি 22

0

সংকলন সংজ্ঞায়নের জন্য লেক্স এবং ইয়্যাক ব্যবহার করা যেমন নিয়মিত অভিব্যক্তি সিস্টেমগুলি ভাল, খুব দরকারী এবং পরিষ্কার। এই সিস্টেমগুলিতে, এক্সপ্রেশন ধরনের অন্যদের শর্তাবলী সংজ্ঞায়িত করা হয়। এটি 'জালিয়াতিপূর্ণ' (আবর্জনা) সম্পর্কিত পার্ল এবং সেড কোড (ইত্যাদি) -তে সাধারণত ঘৃণ্য দূষিত অরক্ষিত লাইন-শোনার দৈত্য ওয়ান-লাইনার নিয়মিত অভিব্যক্তি পাওয়া যায়।


-4

রেগেক্সের জন্য সর্বোত্তম বৈধ এবং স্বাভাবিক ব্যবহারটি ইমেল ঠিকানা ফর্ম্যাট বৈধতার জন্য।

এটি এটির একটি ভাল প্রয়োগ।

ফ্ল্যাট ফাইলগুলি ম্যাসেজ করতে, সিএসভি ফাইলগুলি তৈরি করতে, এসকিউএল সন্নিবেশ বিবৃতি তৈরি করতে এবং সেই ধরণের জিনিসটি তৈরি করতে আমি টেক্সটপ্যাডে এক-অফ হিসাবে নিয়মিত এক্সপ্রেশনগুলি অসংখ্যবার ব্যবহার করেছি।

ভাল লিখিত নিয়মিত এক্সপ্রেশন খুব ধীর হওয়া উচিত নয়। প্রতিস্থাপনের জন্য প্রচুর সংখ্যক কলগুলির বিকল্পগুলি হ'ল ধীরে ধীরে বিকল্প। পাশাপাশি এটি একটি পাসে করতে পারেন।

অনেক পরিস্থিতিতে ঠিক নিয়মিত ভাব প্রকাশ করা এবং অন্য কিছুই নয়।

নির্লিপ্ত অক্ষরগুলির সাথে বিশেষ অ-মুদ্রণযোগ্য অক্ষরগুলি প্রতিস্থাপন করা আরেকটি ভাল ব্যবহার।

আমি অবশ্যই কল্পনা করতে পারি যে এমন কিছু কোডবেস রয়েছে যা রক্ষণাবেক্ষণের ক্ষতির জন্য নিয়মিত প্রকাশকে অতিরিক্ত ব্যবহার করে। তা আমি নিজে কখনও দেখিনি। নিয়মিত এক্সপ্রেশন যথেষ্ট পরিমাণে ব্যবহার না করার জন্য আমি আসলে কোড রিভিউয়ারদের দ্বারা এচকে গেছি।


10
অভিজ্ঞতা দেখায় যে রেইগেক্সগুলি আসলে ইমেল ঠিকানা ফর্ম্যাট বৈধতার জন্য একটি খুব দরিদ্র সরঞ্জাম। একটি রেজেক্স হিসাবে বাস্তবায়িত সত্যিকারের সম্পূর্ণ ফর্ম্যাট বৈধকরণকারীটি একটি বহু-শতাব্দী চরিত্রের একত্ব, যদিও বেশিরভাগ সংক্ষিপ্ত "যথেষ্ট যথেষ্ট" বৈধকারক যা বেশিরভাগ লোকেরা তৈরি করতে 5 মিনিট সময় নেয় তা বৈধ, বিতরণযোগ্য ঠিকানাগুলির বৃহত বিভাগগুলিকে প্রত্যাখ্যান করবে।
ডেভ শেরোহমান

ইয়া শুনি বাবা। আমি "যথেষ্ট ভাল" সম্পর্কে বলছিলাম এবং বৃহত্তর সোয়াথগুলি তাত্ত্বিকভাবে বৃহত্তর হতে পারে এমন সংক্ষিপ্ত প্রকাশে আপনি যে পরিমাণ কভারেজ পেয়েছেন তা বিবেচনা করুন। আমিও একাকীত্ব দেখেছি, তবে আপনার মার্জিত বিকল্পটি কী?
ক্রিস মর্লি

2
আমি ফাইলগুলির একটি বিশাল ডিরেক্টরি যেখানে গতি গুরুত্বপূর্ণ এবং কয়েকটি মিথ্যা ধনাত্মক বা মিথ্যা নেতিবাচক গুরুত্বপূর্ণ ছিল না তাড়াতাড়ি ইমেল ঠিকানা সন্ধান করতে \ w @ \ w +। \ W something এর মতো কিছু ব্যবহার করেছি। তবে ইমেল ঠিকানাটি যাচাই করার সর্বোত্তম উপায় এটি ইমেল প্রেরণা বলে মনে হচ্ছে।
রসফ্যাব্রিকেন্ট

হ্যাঁ ঠিকানার ইমেলটি ইমেলটি একটি বাজে মেসের স্ট্যাকওভারফ্লো.com
নিক ভ্যান ব্রান্ট

@ নিক, @ ডেভ: মেল ঠিকানা বৈধতা কোনও বাজে গণ্ডগোলের দরকার নেই।
tchrist
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.