ঐতিহাসিক দৃষ্টিকোণ
উইকিপিডিয়া নিবন্ধটি নিয়মিত অভিব্যক্তির উত্স সম্পর্কে বেশ বিস্তারিতভাবে বর্ণনা করা হয়েছে (ক্লিন, 1956)। মূল সিনট্যাক্স শুধুমাত্র সঙ্গে তুলনামূলকভাবে সরল ছিল *
, +
, ?
, |
এবং গোষ্ঠী (...)
। এটি ক্ষয়িষ্ণু ছিল ( এবং পাঠযোগ্য, দু'জনের পক্ষে প্রয়োজনীয় বিরোধিতা করা হয়নি), কারণ আনুষ্ঠানিক ভাষাগুলি গা .় গাণিতিক স্বরলিপি দিয়ে প্রকাশিত হয়।
পরবর্তীতে বাক্য গঠন এবং ক্ষমতা সম্পাদকদের সাথে বিকশিত হয় এবং পার্লের সাথে বৃদ্ধি পায় , যা নকশার সাহায্যে ক্ষয় করার চেষ্টা করা হয়েছিল ( "সাধারণ নির্মাণগুলি সংক্ষিপ্ত হওয়া উচিত" )। এটি সিনট্যাক্সকে অনেক জটিল করে তুলেছিল, তবে নোট করুন যে লোকেরা এখন নিয়মিত ভাবের সাথে অভ্যস্ত এবং সেগুলি লেখার ক্ষেত্রে (পড়তে না পারলে) ভাল। এগুলি যেহেতু তারা কখনও কখনও কেবল লেখার জন্য থাকে তা বোঝায় যে তারা যখন খুব দীর্ঘ হয় তবে সাধারণত তারা সঠিক সরঞ্জাম নয়।
নিয়মিত প্রকাশগুলি অপব্যবহারযোগ্য হয়ে থাকে যখন অপব্যবহার করা হয়।
স্ট্রিং-ভিত্তিক নিয়মিত প্রকাশের বাইরে
বিকল্প বাক্য গঠন সম্পর্কে কথা বলুন, আসুন ইতিমধ্যে বিদ্যমান একটি ( কুল-পিপিসিয়ার , কমন লিস্পে ) এর এক ঝলক দেখি । আপনার দীর্ঘ নিয়মিত প্রকাশটি নীচের সাথে পার্স ppcre:parse-string
করা যায়:
(let ((*print-case* :downcase)
(*print-right-margin* 50))
(pprint
(ppcre:parse-string "^(?:([A-Za-z]+):)?(\\/{0,3})(0-9.\\-A-Za-z]+)(?::(\\d+))?(?:\\/([^?#]*))?(?:\\?([^#]*))?(?:#(.*))?$")))
... এবং নিম্নলিখিত ফর্মের ফলাফল:
(:sequence :start-anchor
(:greedy-repetition 0 1
(:group
(:sequence
(:register
(:greedy-repetition 1 nil
(:char-class (:range #\A #\Z)
(:range #\a #\z))))
#\:)))
(:register (:greedy-repetition 0 3 #\/))
(:register
(:sequence "0-9" :everything "-A-Za-z"
(:greedy-repetition 1 nil #\])))
(:greedy-repetition 0 1
(:group
(:sequence #\:
(:register
(:greedy-repetition 1 nil :digit-class)))))
(:greedy-repetition 0 1
(:group
(:sequence #\/
(:register
(:greedy-repetition 0 nil
(:inverted-char-class #\? #\#))))))
(:greedy-repetition 0 1
(:group
(:sequence #\?
(:register
(:greedy-repetition 0 nil
(:inverted-char-class #\#))))))
(:greedy-repetition 0 1
(:group
(:sequence #\#
(:register
(:greedy-repetition 0 nil :everything)))))
:end-anchor)
এই বাক্য গঠনটি আরও ভার্জোজ এবং আপনি নীচের মন্তব্যগুলিতে নজর রাখেন, অগত্যা আরও পাঠযোগ্য। সুতরাং ধরে নিবেন না যে আপনার কম কমপ্যাক্ট সিনট্যাক্স কম থাকায় জিনিসগুলি স্বয়ংক্রিয়ভাবে পরিষ্কার হয়ে যাবে ।
তবে, আপনি যদি আপনার নিয়মিত প্রকাশগুলি নিয়ে সমস্যা শুরু করেন তবে এগুলিকে এই ফর্ম্যাটে রূপান্তর করা আপনাকে ডিসিফার করতে এবং আপনার কোডটি ডিবাগ করতে সহায়তা করতে পারে। স্ট্রিং-ভিত্তিক ফর্ম্যাটগুলির তুলনায় এটি একটি সুবিধা, যেখানে একটি একক অক্ষরের ত্রুটি চিহ্নিত করা কঠিন।
এই বাক্য গঠনটির প্রধান সুবিধা হ'ল স্ট্রিং-ভিত্তিক এনকোডিংয়ের পরিবর্তে কাঠামোগত বিন্যাসটি ব্যবহার করে নিয়মিত এক্সপ্রেশনগুলি হস্তান্তর করা। এটি আপনাকে আপনার প্রোগ্রামে অন্য কোনও ডেটা-স্ট্রাকচারের মতো এ জাতীয় অভিব্যক্তি রচনা এবং তৈরি করতে দেয় । আমি যখন উপরের সিনট্যাক্সটি ব্যবহার করি, সাধারণত এটি হয় কারণ আমি ছোট অংশগুলি থেকে অভিব্যক্তি তৈরি করতে চাই ( আমার কোডগল্ফ উত্তরটিও দেখুন )। আপনার উদাহরণস্বরূপ, আমরা 1 লিখতে পারি :
`(:sequence
:start-anchor
,(protocol)
,(slashes)
,(domain)
,(top-level-domain) ... )
স্ট্রিং-ভিত্তিক নিয়মিত এক্সপ্রেশনগুলিও স্ট্রিং কনটেনটেশন এবং বা সাহায্যকারী ফাংশনে মোড়ানো ইন্টারপোলেশন ব্যবহার করে রচনা করা যেতে পারে। যাইহোক, স্ট্রিং হেরফেরের সঙ্গে সীমাবদ্ধতা যা ঝোঁক হয় বিশৃঙ্খল কোড (পাখির সমস্যা, ব্যাকটিক অসদৃশ বনাম না আমার মনে হয় $(...)
ব্যাশ হয়; এছাড়াও, অব্যাহতি আপনি যে অক্ষরগুলি মাথাব্যাথা দিতে পারে)।
এছাড়াও নোট করুন যে উপরের ফর্মটি (:regex "string")
ফর্মগুলিকে মঞ্জুরি দেয় যাতে আপনি গাছের সাথে সংক্ষিপ্ত বিবরণ মিশ্রিত করতে পারেন। এর সবগুলিই আইএমএইচওকে ভাল পাঠযোগ্যতা এবং সামঞ্জস্যের দিকে নিয়ে যায়; এটি দেলানান দ্বারা প্রকাশিত তিনটি সমস্যার সমাধান করে , পরোক্ষভাবে (অর্থাত্ নিয়মিত প্রকাশের ভাষায় নয়)।
শেষ করা
বেশিরভাগ উদ্দেশ্যে, সংক্ষেপে স্বরলিপিটি আসলে পাঠযোগ্য। ব্যাকট্র্যাকিং ইত্যাদি জড়িত বর্ধিত স্বরলিপিগুলি নিয়ে কাজ করার সময় অসুবিধা রয়েছে, তবে তাদের ব্যবহার খুব কমই ন্যায়সঙ্গত হয়। নিয়মিত এক্সপ্রেশনগুলির অনিয়ন্ত্রিত ব্যবহার অপঠনযোগ্য প্রকাশ করতে পারে lead
নিয়মিত এক্সপ্রেশনগুলি স্ট্রিং হিসাবে এনকোড করা দরকার না। আপনার কাছে যদি কোনও লাইব্রেরি বা একটি সরঞ্জাম রয়েছে যা আপনাকে নিয়মিত এক্সপ্রেশন তৈরি করতে এবং রচনা করতে সহায়তা করে, আপনি স্ট্রিং ম্যানিপুলেশন সম্পর্কিত অনেকগুলি সম্ভাব্য বাগগুলি এড়াতে পারবেন ।
বিকল্পভাবে, আনুষ্ঠানিক ব্যাকরণগুলি আরও পঠনযোগ্য এবং উপ-এক্সপ্রেশনগুলির নামকরণ এবং বিমূর্তকরণে আরও ভাল। টার্মিনালগুলি সাধারণত সাধারণ নিয়মিত এক্সপ্রেশন হিসাবে প্রকাশ করা হয়।
১. আপনি পঠনের সময় আপনার অভিব্যক্তি তৈরি করতে পছন্দ করতে পারেন, কারণ নিয়মিত প্রকাশগুলি কোনও অ্যাপ্লিকেশনটিতে ধ্রুবক হিসাবে থাকে। দেখুন create-scanner
এবং load-time-value
:
'(:sequence :start-anchor #.(protocol) #.(slashes) ... )