নেই একটি জনপ্রিয় উদ্ধৃতি জেমি Zawinski :
কিছু লোক, যখন কোনও সমস্যার মুখোমুখি হয়, তখন "আমি জানি, আমি নিয়মিত অভিব্যক্তি ব্যবহার করব" think এখন তারা দুটি সমস্যা আছে।
এই উদ্ধৃতিটি কীভাবে বোঝার কথা?
নেই একটি জনপ্রিয় উদ্ধৃতি জেমি Zawinski :
কিছু লোক, যখন কোনও সমস্যার মুখোমুখি হয়, তখন "আমি জানি, আমি নিয়মিত অভিব্যক্তি ব্যবহার করব" think এখন তারা দুটি সমস্যা আছে।
এই উদ্ধৃতিটি কীভাবে বোঝার কথা?
উত্তর:
কিছু প্রোগ্রামিং প্রযুক্তির সাধারণত প্রোগ্রামারদের (দ্বারা ভালভাবে বোঝা যায় না রেগুলার এক্সপ্রেশনের , ফ্লোটিং পয়েন্ট , পার্ল , awk , আইওসি ... এবং অন্যদের )।
সমস্যার সঠিক সেট সমাধানের জন্য এগুলি আশ্চর্যজনকভাবে শক্তিশালী সরঞ্জাম হতে পারে। বিশেষত নিয়মিত ভাষাগুলি নিয়মিত ভাষার সাথে মিলে যায় very সমস্যাটির জটিলতা রয়েছে: একটি নিয়মিত ভাষা কীভাবে বর্ণনা করতে হয় তা খুব কম লোকই জানেন (এটি কম্পিউটার বিজ্ঞানের তত্ত্ব / ভাষাবিজ্ঞানের অংশ যা মজার চিহ্নগুলি ব্যবহার করে - আপনি চমস্কি শ্রেণিবিন্যাসে এটি সম্পর্কে পড়তে পারেন )।
এই জিনিসগুলির সাথে কাজ করার সময়, আপনি যদি এগুলি ভুল ব্যবহার করেন তবে সম্ভবত আপনার আসল সমস্যাটি সমাধান করেছেন এমন সম্ভাবনা কম। একটি ব্যবহার এইচটিএমএল মেলে রেগুলার এক্সপ্রেশন (ক পর্যন্ত খুব সাধারণ সংঘটন) মানে হবে এই যে আপনি হবে প্রান্ত মামলা মিস করি। এবং এখন, আপনি এখনও আসল সমস্যাটি পেয়েছেন যা আপনি সমাধান করেন নি এবং ভুল সমাধান ব্যবহার করে প্রবর্তিত করা হয়েছে এমন আরও একটি সূক্ষ্ম বাগ around
এর অর্থ এই নয় যে নিয়মিত প্রকাশগুলি ব্যবহার করা উচিত নয়, বরং তারা কী সমস্যার সমাধান করতে পারে এবং সমাধান করতে পারে না এবং সেগুলি ন্যায়বিচারের সাথে ব্যবহার করতে পারে না তা বোঝার জন্য কাজ করা উচিত।
সফ্টওয়্যার রক্ষণাবেক্ষণের মূল কীটি রক্ষণাবেক্ষণযোগ্য কোড লেখা writing নিয়মিত এক্সপ্রেশন ব্যবহার করা সেই লক্ষ্যের বিপরীতে হতে পারে। নিয়মিত এক্সপ্রেশন নিয়ে কাজ করার সময়, আপনি একটি বিশেষ ডোমেন নির্দিষ্ট ভাষায় একটি মিনি কম্পিউটার (বিশেষত একটি অ-বিড়ম্বনকারী সসীম রাষ্ট্র অটোমেটন ) লিখেছেন । এই ভাষায় 'হ্যালো ওয়ার্ল্ড' সমতুল্য লেখা সহজ এবং এতে আধ্যাত্মিক আত্মবিশ্বাস অর্জন করা সহজ, তবে অতিরিক্ত বাগগুলি সনাক্ত করা এবং সংশোধন করা খুব কঠিন হতে পারে এমন লেখাগুলি এড়াতে নিয়মিত ভাষার বোঝার সাথে আরও মনোযোগ দেওয়া দরকার (কারণ) তারা নিয়মিত ভাব প্রকাশের প্রোগ্রামটির অংশ নয়)।
সুতরাং এখন আপনি একটি নতুন সমস্যা পেয়েছেন; আপনি এটি সমাধান করার জন্য নিয়মিত অভিব্যক্তির সরঞ্জামটি বেছে নিয়েছিলেন (যখন এটি অনুপযুক্ত) এবং আপনার কাছে এখন দুটি বাগ পেয়েছে, উভয়ই খুঁজে পাওয়া শক্ত, কারণ এগুলি বিমূর্ততার অন্য স্তরে লুকানো রয়েছে।
নিয়মিত এক্সপ্রেশন - বিশেষত অপ্রচলিত কোডগুলি - কোড করা, বোঝা এবং বজায় রাখা সম্ভবত সম্ভাব্য। আপনাকে কেবল স্ট্যাক ওভারফ্লো ট্যাগযুক্ত প্রশ্নের সংখ্যা দেখতে হবে [regex]
যেখানে প্রশ্নকর্তা ধরে নিয়েছেন যে তাদের সমস্যার উত্তর একটি রেজেক্স এবং পরবর্তীকালে আটকে গিয়েছে। অনেক ক্ষেত্রেই সমস্যাটি (এবং সম্ভবত হওয়া উচিত) অন্যভাবে সমাধান করা যেতে পারে।
এর অর্থ হ'ল, যদি আপনি একটি রেজেেক্স ব্যবহার করার সিদ্ধান্ত নেন তবে আপনার এখন দুটি সমস্যা রয়েছে:
মূলত, আমি মনে করি তার অর্থ হ'ল যদি আপনার সমস্যা সমাধানের অন্য কোনও উপায় না থাকে তবে আপনার কেবলমাত্র একটি রেজেক্স ব্যবহার করা উচিত। আর একটি সমাধান সম্ভবত কোড করা, বজায় রাখা এবং সমর্থন করা সহজ হতে চলেছে। এটি ধীর বা কম দক্ষ হতে পারে, তবে এটি রক্ষণাবেক্ষণ এবং সহায়তার ক্ষেত্রে সহজ স্বাচ্ছন্দ্য না হওয়া উচিত ওভারাইডিং উদ্বেগ be
এটি বেশিরভাগই জিভ-ইন-গাল রসিকতা, যদিও সত্যের দানা থাকে।
কিছু কাজ রয়েছে যার জন্য নিয়মিত প্রকাশগুলি একটি দুর্দান্ত ফিট। আমি একবারে নিয়মিত এক্সপ্রেশন দিয়ে ম্যানুয়ালি লিখিত রিকার্সি ডেসেন্ট পার্সার কোডের 500 টি লাইন প্রতিস্থাপন করেছি যা পুরোপুরি ডিবাগ হতে প্রায় 10 মিনিট সময় নেয়। লোকেরা বলে যে রেজেক্সগুলি বোঝা এবং ডিবাগ করা শক্ত, তবে যথাযথভাবে প্রয়োগ হওয়া একটি বিশাল হাত-ডিজাইন করা পার্সার হিসাবে ডিবাগ করা প্রায় কঠিন নয়। আমার উদাহরণস্বরূপ, নন-রেজেক্স সমাধানের সমস্ত প্রান্তের মামলাগুলি ডিবাগ করতে দুই সপ্তাহ সময় লেগেছিল।
তবে আঙ্কেল বেনকে প্যারাফ্রেজ করতে:
মহান অভিব্যক্তি সঙ্গে মহান দায়িত্ব আসে।
অন্য কথায়, রেইজেক্সগুলি আপনার ভাষার সাথে ভাব প্রকাশ করে তবে কোনও নির্দিষ্ট কাজের জন্য এক্সপ্রেশনটির সর্বাধিক পঠনযোগ্য পদ্ধতিটি বেছে নেওয়ার জন্য প্রোগ্রামারকে এটি আরও বেশি দায়বদ্ধ করে।
কিছু জিনিস প্রাথমিকভাবে নিয়মিত প্রকাশের জন্য ভাল কাজের মতো দেখায় তবে তা হয় না। উদাহরণস্বরূপ, নেস্টেড টোকেন সহ যে কোনও কিছুই যেমন এইচটিএমএল। একটি সহজ পদ্ধতি আরও স্পষ্ট হয়ে উঠলে কখনও কখনও লোকেরা নিয়মিত ভাব প্রকাশ করে। উদাহরণস্বরূপ, string.endsWith("ing")
সমতুল্য রেজেক্সের চেয়ে বোঝা সহজ। কখনও কখনও লোকেরা একটি বৃহত সমস্যাটিকে একটি একক রেজেক্সে ছড়িয়ে দেওয়ার চেষ্টা করে, যেখানে এটি টুকরো টুকরো করা আরও উপযুক্ত। কখনও কখনও লোকেরা একই কাজ করার জন্য একটি নামকৃত ফাংশন তৈরি করার পরিবর্তে (সম্ভবত একটি রেজেক্সের সাহায্যে অভ্যন্তরীণভাবে প্রয়োগ করা হয়) পরিবর্তে একটি রেজেেক্স পুনরাবৃত্তি করে যথাযথ বিমূর্ততা তৈরি করতে ব্যর্থ হয়।
কিছু কারণে রেগেক্সদের একক দায়িত্ব এবং ডিআরওয়াইয়ের মতো সাধারণ সফ্টওয়্যার ইঞ্জিনিয়ারিং নীতিগুলির অন্ধ স্পট তৈরি করার এক অদ্ভুত প্রবণতা রয়েছে। এ কারণেই এমনকি যারা তাদের ভালবাসেন তাদেরও মাঝে মাঝে সমস্যাযুক্ত মনে হয়।
জেফ আতউড এই খুব উক্তিটি নিয়ে আলোচনা করে একটি ব্লগ পোস্টে একটি আলাদা ব্যাখ্যা প্রকাশ করেছেন: নিয়মিত প্রকাশ: এখন আপনার দুটি সমস্যা আছে ( লিঙ্কটির জন্য ইউফোরিককে ধন্যবাদ )
আসল 1997 থ্রেডে জেমির পোস্টগুলির সম্পূর্ণ পাঠ্য বিশ্লেষণ করে, আমরা নিম্নলিখিতটি পাই:
পার্লের প্রকৃতি প্রায় সমস্ত অন্যান্য কৌশল বাদে নিয়মিত প্রকাশের ব্যবহারকে উত্সাহ দেয়; এগুলি বিন্দু এ থেকে বিন্দু বিতে যাওয়ার "সর্বাধিক সুস্পষ্ট" (কমপক্ষে, এমন লোকদের পক্ষে যারা আরও ভাল জানেন না) তাদের কাছে খুব দূরে way
প্রথম উদ্ধৃতিটি গুরুত্ব সহকারে নেওয়া যায় না gl তবে এটি, আমি সম্পূর্ণরূপে একমত এখানে জেমি যে বিষয়টি তৈরি করার চেষ্টা করছিলেন তা হল: নিয়মিত প্রকাশগুলি খারাপ নয়, তবে নিয়মিত প্রকাশের অতিরিক্ত ব্যবহার করা খারাপ।
এমনকি আপনি যদি না সম্পূর্ণরূপে রেগুলার এক্সপ্রেশনের বুঝতে, আপনি মধ্যে চালানো গোল্ডেন হাতুড়ি সমস্যা, রেগুলার এক্সপ্রেশন, সঙ্গে একটি সমস্যা সমাধানের চেষ্টা যখন এটা সহজ এবং আরো নিয়মিত কোড সহ একই জিনিস করে (এছাড়াও দেখুন স্পষ্ট হয়ে যেত CodingHorror: Regex ব্যবহার বনাম রেজেক্স অপব্যবহার )।
আর একটি ব্লগ পোস্ট রয়েছে যা উদ্ধৃতিটির প্রসঙ্গটি দেখে এবং আটউডের চেয়ে আরও বিশদে যায়: জেফ্রি ফ্রেডেলের ব্লগ: বিখ্যাত "এখন আপনার দুটি সমস্যা আছে" এর উত্সের উত্স
এই উদ্ধৃতিটি নিয়ে কয়েকটি জিনিস চলছে।
উদ্ধৃতি আগের তামাশা একটি restatement হল:
যখনই কোনও সমস্যার মুখোমুখি হন, কিছু লোক "AWK ব্যবহার করতে দেয়" বলে say এখন তারা দুটি সমস্যা আছে. - ডি টিলব্রুক
এটি একটি রসিকতা এবং একটি সত্য খনন, তবে এটি রেগেক্সকে অন্যান্য খারাপ সমাধানের সাথে যুক্ত করে একটি খারাপ সমাধান হিসাবে হাইলাইট করার একটি উপায়। এটি দুর্দান্ত হা হা শুধুমাত্র গুরুতর মুহূর্ত।
আমার মনে হ'ল, এই উদ্ধৃতিটি উদ্দেশ্যমূলকভাবে ব্যাখ্যার জন্য উন্মুক্ত — অর্থটি সরাসরি এগিয়ে। কেবল একটি নিয়মিত এক্সপ্রেশন ব্যবহারের ধারণাটি ঘোষণার ফলে সমস্যার সমাধান হয়নি। এছাড়াও, আপনি যে ভাষা ব্যবহার করছেন তা থেকে পৃথক হয়ে থাকা বিধিগুলি সহ একটি অতিরিক্ত ভাষা যুক্ত করে আপনি কোডটির জ্ঞানীয় জটিলতা বৃদ্ধি করেছেন।
যদিও রসিকতা হিসাবে মজার, আপনার একটি অ-রেজেক্স সমাধানের জটিলতার সাথে রেজেক্স সমাধানের জটিলতা + রেজেক্সগুলি সহ অতিরিক্ত জটিলতার সাথে তুলনা করতে হবে। রেজেক্সস যুক্ত করার অতিরিক্ত ব্যয় থাকা সত্ত্বেও, একটি রেজেক্সের সাহায্যে সমস্যা সমাধান করা সার্থক হতে পারে।
RegularExpressionsarenoworsetoreadormaintainthananyotherunformattedcontent; indeedaregexisprobablyeasiertoreadthanthispieceoftexthere-butunfortunatelytheyhaveabadreputationbecausesomeimplementationsdon'tallowformattingandpeopleingeneraldon'tknowthatyoucandoit।
(নিয়মিত এক্সপ্রেশনগুলি অন্য যে কোনও অপ্রত্যাশিত সামগ্রীর চেয়ে পড়া বা বজায় রাখা খারাপ নয়; প্রকৃতপক্ষে একটি রেজেক্স সম্ভবত এখানে এই পাঠ্যের টুকরোটির চেয়ে পড়া সহজ - তবে দুর্ভাগ্যক্রমে তাদের একটি খারাপ খ্যাতি রয়েছে কারণ কিছু বাস্তবায়ন ফর্ম্যাট করতে দেয় না এবং সাধারণভাবে মানুষকে আপনি এটি করতে পারেন তা জানেন না))
এখানে একটি তুচ্ছ উদাহরণ:
^(?:[^,]*+,){21}[^,]*+$
যা সত্যিই পড়া বা বজায় রাখা এতটা কঠিন নয়, তবে এটির মতো দেখতে এটি আরও সহজ:
(?x) # enables comments, so this whole block can be used in a regex.
^ # start of string
(?: # start non-capturing group
[^,]*+ # as many non-commas as possible, but none required
, # a comma
) # end non-capturing group
{21} # 21 of previous entity (i.e. the group)
[^,]*+ # as many non-commas as possible, but none required
$ # end of string
এটি একটি শীর্ষ-উদাহরণের সামান্য বিষয় (মন্তব্য $
করা মন্তব্য করার অনুরূপ i++
) তবে স্পষ্টতই এটি পড়তে, বুঝতে এবং বজায় রাখতে কোনও সমস্যা হওয়া উচিত নয়।
এতক্ষণ আপনি যখন পরিষ্কার হন যে কখন নিয়মিত ভাব প্রকাশ করা যায় এবং যখন তারা কোনও খারাপ ধারণা হয় তবে এগুলিতে কোনও সমস্যা নেই এবং বেশিরভাগ সময় জেডব্লুজেডের উক্তিটি সত্যই প্রয়োগ হয় না।
*+
কী লাভ? কীভাবে এটি বিচারের চেয়ে আলাদা (কার্যকরী) *
?
*+
এই ক্ষেত্রে আক্ষরিকভাবে করার কোনও অর্থ নেই ; সবকিছু নোঙ্গরযুক্ত এবং অটোমেটনের মাধ্যমে একক পাসে মেলা যায় যা 22 পর্যন্ত গণনা করতে পারে those অ-কমা সেটগুলিতে সঠিক সংশোধকটি কেবল সাধারণ পুরানো *
। (আরও বড় কথা, লোভী এবং অ-লোভী মিলে যাওয়া অ্যালগরিদমের মধ্যেও কোনও পার্থক্য থাকা উচিত না It's এটি অত্যন্ত সাধারণ ঘটনা))
ক্রিসএফের উত্তর ছাড়াও - যে নিয়মিত এক্সপ্রেশনগুলি "কোড করা, বোঝা এবং রক্ষণাবেক্ষণ করা কঠিন", আরও খারাপ: তারা এইচটিএমএল এর মতো জিনিসগুলিকে পার্স করার জন্য তাদের ব্যবহার করার চেষ্টা করার পক্ষে যথেষ্ট শক্তিশালী। "আমি এইচটিএমএলকে কীভাবে পার্স করব?" এ এসওতে অসংখ্য প্রশ্ন দেখুন? উদাহরণস্বরূপ, এসও এর মধ্যে একক অতি মহাকাব্যিক উত্তর !
নিয়মিত প্রকাশগুলি খুব শক্তিশালী তবে তাদের একটি ছোট এবং একটি বড় সমস্যা রয়েছে; এগুলি লেখা শক্ত এবং পড়া অসম্ভব।
সর্বোত্তম ক্ষেত্রে নিয়মিত প্রকাশের ব্যবহার সমস্যার সমাধান করে, তাই আপনার কাছে কেবল জটিল কোডটির রক্ষণাবেক্ষণের সমস্যা রয়েছে। আপনি যদি নিয়মিত এক্সপ্রেশনটি ঠিক ঠিক না পান তবে আপনার আসল সমস্যা এবং অপঠনযোগ্য কোডের সাথে সমস্যা রয়েছে যা কাজ করে না।
কখনও কখনও নিয়মিত এক্সপ্রেশনকে কেবল লেখার কোড হিসাবে উল্লেখ করা হয়। নিয়মিত অভিব্যক্তির মুখোমুখি হয়েছে যা ফিক্সিংয়ের প্রয়োজন, ভাবটি বোঝার চেষ্টা করার চেয়ে স্ক্র্যাচ থেকে শুরু করা প্রায়শই দ্রুত হয়।
সমস্যাটি হ'ল রেজেক্স একটি জটিল জন্তু এবং আপনি কেবলমাত্র সমস্যাটি সমাধান করেন যদি আপনি পুরোপুরিভাবে রেজেক্স ব্যবহার করেন। যদি আপনি এটি না করেন তবে আপনার 2 টি সমস্যা রয়েছে: আপনার আসল সমস্যা এবং রেজেক্স।
আপনি দাবি করেন যে এটি একশ লাইনের কোডের কাজ করতে পারে তবে আপনি এই যুক্তিটিও তৈরি করতে পারেন যে 100 লাইন স্পষ্ট, সংক্ষিপ্ত কোডটি রেজেক্সের এক লাইনের চেয়ে ভাল।
আপনার যদি এর কিছু প্রমাণ প্রয়োজন হয়: আপনি এই এসও ক্লাসিকটি পরীক্ষা করতে পারেন বা কেবল এসও রেজেক্স ট্যাগের মাধ্যমে ঝুঁটি নিতে পারেন
অর্থটির দুটি অংশ রয়েছে:
আপনি 2014 সালে এটির জন্য জিজ্ঞাসা করার সাথে সাথে, আজকের প্রেক্ষাপটের সাথে তুলনা করে 1997 এর প্রসঙ্গের প্রোগ্রামিং ভাষার আদর্শগুলিতে ফোকাস করা আকর্ষণীয় হবে। আমি এই বিতর্কটি এখানে প্রবেশ করব না তবে পার্ল এবং পার্ল সম্পর্কেই নিজের মতামত ব্যাপকভাবে পরিবর্তিত হয়েছে।
তবে 2013 প্রেক্ষাপটে থাকার ( ডি L'একটি coulé sous Les Ponts Eau depuis), আমি ব্যবহার উদ্ধৃতির মধ্যে পুনরাবৃত্তি ফোকাস করতে সুপারিশ করবে একটি বিখ্যাত xkcd কমিক জেমি Zawinski এক সরাসরি উদ্ধৃতি যে :
প্রথমে আমার এই কমিকটি বুঝতে সমস্যা হয়েছিল কারণ এটি জাভিনস্কির উদ্ধৃতি, এবং একটি জে-জেড গানের লিরিকের একটি উদ্ধৃতি এবং জিএনইউ program --help -z
পতাকা 2 এর একটি উল্লেখ ছিল , সুতরাং এটি বুঝতে আমার পক্ষে এটি খুব বেশি সংস্কৃতি ছিল।
আমি জানতাম এটি মজাদার ছিল, আমি এটি অনুভব করছিলাম তবে কেন তা সত্যিই আমি জানতাম না। লোকেরা প্রায়শই পার্ল এবং রেইগেক্সস সম্পর্কে রসিকতা করে থাকে, বিশেষত যেহেতু এটি হিপস্টিস্ট প্রোগ্রামিং ভাষা নয়, কেন এটি মজাদার বলে মনে করা হচ্ছে তা সত্যিই জানেন না ... পার্ল স্নিগ্ধরা নির্বোধ কাজগুলি করার কারণে ।
সুতরাং প্রাথমিক উদ্ধৃতিটি ব্যথিত উপকরণগুলির সাথে প্রোগ্রামিংয়ের ফলে বাস্তব জীবনের সমস্যাগুলির (বেদনা?) ভিত্তিক একটি ব্যঙ্গাত্মক রসিক বলে মনে হচ্ছে। যেমন একটি হাতুড়ি কোনও রাজমিস্ত্রিটিকে আঘাত করতে পারে, এমন সরঞ্জামগুলির সাথে প্রোগ্রামিং করে যা কোনও বিকাশকারী বেছে নিতে পারে না যদি সে আঘাত করতে পারে (মস্তিষ্ক, অনুভূতি)। কখনও কখনও, কোন সরঞ্জামটি সবচেয়ে ভাল তা নিয়ে দুর্দান্ত বিতর্ক হয় তবে এটি প্রায় আপনার মূল্যহীন কারণ এটি আপনার স্বাদ বা আপনার প্রোগ্রামিং দলের স্বাদ , সাংস্কৃতিক বা অর্থনৈতিক কারণে সমস্যা। এটি সম্পর্কে আরও একটি দুর্দান্ত এক্সকেসিডি কমিক:
আমি মানুষকে রেজেক্সগুলি সম্পর্কে বেদনা অনুধাবন করতে পারি এবং তারা বিশ্বাস করে যে রেজেক্সেসের জন্য ডিজাইন করা হয়েছে তার জন্য অন্য একটি সরঞ্জাম আরও ভাল উপযুক্ত। @ কার্ল-বিলেফেল্ট যেমন আপনার প্রশ্নের উত্তরটি দুর্দান্ত প্রকাশের সাথে উত্তর দেয় ততই বড় দায়বদ্ধতা আসে এবং এজন্য বিশেষতঃ রেজিক্সরা উদ্বিগ্ন। যদি কোনও বিকাশকারী কীভাবে রে-অ্যাক্সেসগুলির সাথে এস-ডিল করেন সেদিকে খেয়াল না রাখেন তবে শেষ পর্যন্ত কোডটি বজায় রাখার লোকেদের জন্য এটি ব্যথা হবে।
দামিয়ান কনউয়ের পার্ল বেস্ট প্র্যাকটিসেস (২০০৫-এর একটি বই) এর একটি আদর্শ উদাহরণ দেখানো একটি উদ্ধৃতি দ্বারা উদ্ধৃতি পুনর্নবীকরণ সম্পর্কে এই উত্তরটি শেষ করব ।
তিনি ব্যাখ্যা করেছেন যে এই ধরণের লেখার জন্য:
m{'[^\\']*(?:\\.[^\\']*)*'}
... এর মতো প্রোগ্রাম লেখার চেয়ে বেশি গ্রহণযোগ্য নয় :
sub'x{local$_=pop;sub'_{$_>=$_[0
]?$_[1]:$"}_(1,'*')._(5,'-')._(4
,'*').$/._(6,'|').($_>9?'X':$_>8
?'/':$")._(8,'|').$/._(2,'*')._(
7,'-')._(3,'*').$/}print$/x($=).
x(10)x(++$x/10).x($x%10)while<>;
তবে এটি আবার লেখা যেতে পারে , এটি এখনও সুন্দর নয় তবে কমপক্ষে এটি এখন টিকে আছে।
# Match a single-quoted string efficiently...
m{ ' # an opening single quote
[^\\']* # any non-special chars (i.e., not backslash or single quote)
(?: # then all of...`
\\ . # any explicitly backslashed char
[^\\']* # followed by any non-special chars
)* # ...repeated zero or more times
' # a closing single quote
}x
এই জাতীয় আয়তক্ষেত্রাকার আকৃতির কোডটি হ'ল দ্বিতীয় সমস্যাটি নয় যা একটি পরিষ্কার, রক্ষণাবেক্ষণযোগ্য এবং পঠনযোগ্য উপায়ে ফর্ম্যাট করা যায় re
/* Multiply the first 10 values in an array by 2. */ for (int i = 0 /* the loop counter */; i < 10 /* continue while it is less than 10 */; ++i /* and increment it by 1 in each iteration */) { array[i] *= 2; /* double the i-th element in the array */ }
কম্পিউটার বিজ্ঞান থেকে আপনার যদি একটি জিনিস শিখতে হবে তবে তা হ'ল চমস্কি শ্রেণিবিন্যাস । আমি বলব যে নিয়মিত প্রকাশের সাথে সমস্ত সমস্যাগুলি এর সাথে প্রসঙ্গ-মুক্ত ব্যাকরণকে বিশ্লেষণ করার প্রচেষ্টা থেকে আসে। আপনি যখন সিএফজিতে বাসা বাঁধার স্তরে সীমাবদ্ধতা চাপিয়ে দিতে (বা ভাবেন যে আপনি একটি সীমা চাপিয়ে দিতে পারেন), আপনি সেই দীর্ঘ এবং জটিল নিয়মিত প্রকাশ পেয়ে যাবেন।
নিয়মিত ভাবগুলি পূর্ণ-স্কেল পার্সিংয়ের চেয়ে টোকেনাইজেশনের জন্য আরও উপযুক্ত।
তবে, আশ্চর্যজনকরকম একটি বড় সেট যা প্রোগ্রামারদের পার্স করতে হয় তা নিয়মিত ভাষা (বা আরও খারাপ, নিয়মিত ভাষার দ্বারা প্রায় বিশ্লেষণযোগ্য এবং যদি আপনি কেবল আরও কিছুটা কোড লিখেন ...) দ্বারা পার্সেবল হয়।
সুতরাং যদি কেউ "আহা" হিসাবে অভ্যস্ত হয় তবে আমার কাছে পাঠ্য আলাদা করে নেওয়া দরকার, আমি একটি নিয়মিত ভাব প্রকাশ করব ", যখন আপনাকে কোনও ধাক্কা-ডাউন অটোমেটনের কাছাকাছি কিছু দরকার হয়, তখন কোনও সিএফজি পার্সার অথবা আরও শক্তিশালী ব্যাকরণ। এটি সাধারণত কান্নায় শেষ হয়।
সুতরাং, আমি মনে করি উদ্ধৃতিটি এতটা গালি দেওয়ার মতো রেজেক্সপস নয়, তাদের ব্যবহার রয়েছে (এবং ভালভাবে ব্যবহার করা হয়েছে, তারা সত্যই খুব দরকারী) তবে রেগেক্সপসের উপর অতিরিক্ত নির্ভরতা (বা, বিশেষত, তাদের অবৈধ পছন্দ) ।
jwz কেবল এই উক্তিটি নিয়ে তার দালালের বাইরে। নিয়মিত প্রকাশগুলি কোনও ভাষার বৈশিষ্ট্যের চেয়ে আলাদা নয় - স্ক্রু করা সহজ, মার্জিতভাবে ব্যবহার করা শক্ত, সময়ে শক্তিশালী, সময়ে অনুপযুক্ত, প্রায়শই ভাল ডকুমেন্টেড, প্রায়শই দরকারী।
একই কথা ভাসমান পয়েন্ট গণিত, ক্লোজার, অবজেক্ট-ওরিয়েন্টেশন, অ্যাসিঙ্ক্রোনাস আই / ও, বা অন্য যে কোনও নামে আপনি নাম রাখতে পারেন। আপনি কী করছেন তা যদি না জানেন তবে প্রোগ্রামিং ভাষাগুলি আপনাকে দু: খিত করে তুলতে পারে।
আপনি যদি ভাবেন যে রেজেক্সেসগুলি পড়া খুব শক্ত, তবে প্রশ্নের মধ্যে থাকা প্যাটার্নটি গ্রাস করার জন্য সমপরিমাণ পার্সার বাস্তবায়ন পড়ার চেষ্টা করুন। প্রায়শই রেজেক্সেস জিতে থাকে কারণ তারা পুরো পার্সারগুলির চেয়ে কমপ্যাক্ট ... এবং বেশিরভাগ ভাষায়, তারা আরও দ্রুত।
নিয়মিত প্রকাশ (বা অন্য কোনও ভাষা বৈশিষ্ট্য) ব্যবহার থেকে বিরত থাকবেন না কারণ একটি স্ব-প্রচারকারী ব্লগার অযোগ্য বিবৃতি দিয়েছেন। নিজের জন্য জিনিস চেষ্টা করে দেখুন এবং আপনার জন্য কী কাজ করে তা দেখুন।
আমার প্রিয়, এর গভীরতর উত্তর বিখ্যাত রব পাইক একটি অভ্যন্তরীণ গুগল কোড মন্তব্য থেকে পুনরুত্পাদন করা একটি ব্লগ পোস্টে দিয়েছেন http : // and.html
সংক্ষিপ্তসারটি হ'ল এগুলি যে খারাপ তা নয় , তবে এগুলি প্রায়শই প্রয়োজনীয় কাজের জন্য উপযুক্ত নয় এমন কাজের জন্য ব্যবহৃত হয়, বিশেষত যখন লেক্সিং এবং কিছু ইনপুট পার্স করার বিষয়টি আসে।
নিয়মিত ভাব প্রকাশ করা শক্ত, ভাল লিখতে শক্ত এবং অন্য প্রযুক্তির তুলনায় ব্যয়বহুল হতে পারে ... অন্যদিকে লেক্সারস সঠিকভাবে লিখতে মোটামুটি সহজ (যদি সংক্ষিপ্তভাবে না হয়), এবং খুব সহজে পরীক্ষা করা যায়। বর্ণমালা শনাক্তকারীদের সন্ধানের বিষয়টি বিবেচনা করুন। রিজএক্সপ্যাক ("[a-ZA-Z _] [a-ZA-Z_0-9] *" এর মতো কিছু) লিখতে খুব বেশি কঠিন নয়, তবে সরল লুপ হিসাবে লিখতে খুব বেশি কষ্ট হয় না। লুপটির কার্যকারিতা যদিও অনেক বেশি হবে এবং কভারগুলির নীচে অনেক কম কোড জড়িত। একটি নিয়মিত এক্সপ্রেশন লাইব্রেরি একটি বড় জিনিস। পার্সে আইডেন্টিফায়ার ব্যবহার করে দুধের দোকানে যাওয়ার জন্য ফেরারি ব্যবহার করার মতো।
তিনি এর থেকেও আরও অনেক কিছু বলেছেন, নিয়মিত অভিব্যক্তিগুলি দরকারী হিসাবে যুক্তিযুক্ত, যেমন টেক্সট সম্পাদকদের মধ্যে নিদর্শনগুলির ডিসপোজেবল মেলিং তবে কমপ্লাইড কোডে খুব কমই ব্যবহার করা উচিত। এটি একটি পড়ার মূল্য।
এটি অ্যালান পেরিলিসের চিত্র # 34 সম্পর্কিত:
স্ট্রিংটি একেবারে ডেটা স্ট্রাকচার এবং যেখানেই এটি পাস করা হয় সেখানে প্রক্রিয়াটির অনেক বেশি সদৃশ হয়। এটি তথ্য গোপনের জন্য একটি নিখুঁত বাহন।
সুতরাং আপনি যদি আপনার ডেটা স্ট্রাকচার হিসাবে চরিত্রের স্ট্রিংটি বেছে নেন (এবং, প্রাকৃতিকভাবে, রেজেক্স-ভিত্তিক কোড এটির হেরফেরের জন্য অ্যালগরিদম হিসাবে) তবে এটি কাজ করেও আপনার একটি সমস্যা রয়েছে: ডেটার অনুপযুক্ত উপস্থাপনের চারপাশে খারাপ নকশা যা কঠিন is প্রসারিত এবং অদক্ষ।
তবে, প্রায়শই এটি কাজ করে না: মূল সমস্যাটি সমাধান হয় না, এবং সেই ক্ষেত্রে আপনার দুটি সমস্যা রয়েছে।
রেগেক্সগুলি তাত্ক্ষণিক ও নোংরা পাঠ্য পার্সিংয়ের জন্য ব্যাপকভাবে ব্যবহৃত হয়। এগুলি নিখুঁত প্রকাশের জন্য দুর্দান্ত সরঞ্জাম যা কেবল একটি সরল স্ট্রিং ম্যাচের চেয়ে কিছুটা জটিল।
তবে রেজিক্সগুলি আরও জটিল সার্ভারাল ইস্যুগুলি মাথা বাড়ানোর সাথে সাথে পেতে থাকে।
সুতরাং এটি কোনও পাঠ্য প্রক্রিয়াজাতকরণ সমস্যাটি দিয়ে শুরু করা খুব সহজ it আসল সমস্যা