রেগেক্স ইঞ্জিন বাস্তবায়নের পিছনে বাস্তবিক বিষয়গুলির অনুমোদনমূলক উল্লেখটি রাশ কক্সের তিনটি ব্লগ পোস্টের একটি সিরিজ । সেখানে বর্ণিত হিসাবে, যেহেতু ব্যাক-রেফারেন্সগুলি আপনার ভাষাটিকে নিয়মিত করে তোলে, সেগুলি ব্যাকট্র্যাকিং ব্যবহার করে প্রয়োগ করা হয় ।
লোগোহেডস এবং লুকবিহাইন্ডগুলি, রেগেক্স প্যাটার্ন মেলানো ইঞ্জিনগুলির অনেকগুলি বৈশিষ্ট্যের মতো, স্ট্রিং কোনও ভাষার সদস্য কিনা তা সিদ্ধান্ত নেওয়ার দৃষ্টিতে পুরোপুরি ফিট হয় না। বরং রেগেক্সেসের সাহায্যে আমরা সাধারণত বৃহত্তর স্ট্রিংয়ের মধ্যে সাবস্ট্রিংগুলি অনুসন্ধান করি। "ম্যাচগুলি" হ'ল সাবস্ট্রিংগুলি যা ভাষার সদস্য, এবং প্রত্যাবর্তন মান বৃহত্তর স্ট্রিংয়ের মধ্যে থাকা স্ট্রিংয়ের শুরু এবং শেষ পয়েন্ট।
লুক হেডস এবং লুকবিহিন্ডগুলির বিন্দুটি অ-নিয়মিত ভাষাগুলির সাথে মিলের দক্ষতার পরিচয় দেওয়ার পক্ষে তেমন কিছু নয়, বরং ইঞ্জিনটি মিলে যাওয়া স্ট্রিংয়ের শুরু এবং শেষ পয়েন্টগুলি কোথায় প্রতিবেদন করে তা সামঞ্জস্য করার জন্য।
আমি http://www.regular-expressions.info/lookaround.html এ বর্ণনার উপর নির্ভর করছি । এই বৈশিষ্ট্যটিকে সমর্থনকারী রেজেক্স ইঞ্জিনগুলি (পার্ল, টিসিএল, পাইথন, রুবি, ...) সমস্তগুলি ব্যাকট্র্যাকিংয়ের উপর ভিত্তি করে বলে মনে হচ্ছে (যেমন, তারা কেবল নিয়মিত ভাষার চেয়ে অনেক বড় ভাষার সমর্থন করে)। তারা এই বৈশিষ্ট্যটি কার্য সম্পাদনের জন্য বাস্তব সসীম অটোমেটা তৈরির চেষ্টা না করে ব্যাকট্র্যাকিংয়ের তুলনামূলকভাবে "সাধারণ" এক্সটেনশন হিসাবে প্রয়োগ করছে বলে মনে হচ্ছে।
ইতিবাচক চেহারা
ধনাত্মক বর্ণনীর জন্য সিনট্যাক্স হ'ল (?=
রেজেক্স)
। সুতরাং উদাহরণস্বরূপ q(?=u)
সাথে মেলে q
শুধুমাত্র যদি এটা দ্বারা অনুসরণ করা হয় u
, কিন্তু মিলছে না u
। আমি কল্পনা করি তারা ব্যাকট্র্যাকিংয়ের বিভিন্নতার সাথে এটি বাস্তবায়ন করে implement ইতিবাচক চেহারাটির আগে ভাবের জন্য একটি এফএসএম তৈরি করুন। যখন সেই ম্যাচগুলি মনে হয় এটি কোথায় শেষ হয়েছে এবং একটি নতুন এফএসএম শুরু করুন যা ইতিবাচক চেহারাটির অভ্যন্তরে অভিব্যক্তিটি উপস্থাপন করে। যদি এটি মেলে তবে আপনার একটি "ম্যাচ" হবে, তবে ইতিবাচক চেহারা অবধি ম্যাচটি শুরু হওয়ার ঠিক আগে ম্যাচটি "শেষ" হয়।
ব্যাকট্রাকিং ছাড়াই এর একমাত্র অংশটি হ'ল আপনাকে যে ইনপুটটির সেই বিন্দুটি মনে করতে হবে যেখানে লুথহ্যাড শুরু হয় এবং ম্যাচটি শেষ হওয়ার পরে আপনার ইনপুট টেপটি এই অবস্থানে ফিরিয়ে নিয়ে যায়।
নেতিবাচক লুকোহেড
নেতিবাচক বর্ণনীর জন্য সিনট্যাক্স হ'ল (?!
রেজেক্স)
। উদাহরণস্বরূপ, যদি এটি অনুসরণ না করা হয় কেবল তখনই q(?!u)
মেলে । এটি হয় অন্য কোনও অক্ষর দ্বারা অনুসরণ করা যেতে পারে , বা স্ট্রিংয়ের একেবারে শেষে। আমি ভাবছি এটি লুপ হেড এক্সপ্রেশনটির জন্য একটি এনএফএ তৈরি করে প্রয়োগ করা হয়েছে, তারপরে যদি এনএফএ পরবর্তী স্ট্রিংয়ের সাথে মেলে না তবে ব্যর্থ হয় ingq
u
q
q
আপনি যদি ব্যাকট্র্যাকিংয়ের উপর নির্ভর না করে এটি করতে চান তবে আপনি লুকোহেড এক্সপ্রেশনটির এনএফএকে অস্বীকার করতে পারেন, তবে আপনি ইতিবাচক চেহারাটির সাথে একইভাবে আচরণ করুন।
ইতিবাচক চেহারা
(?<=
)
(?=q)u
u
q
q
এনএনএন
আপনি ছেদ গ্রহণ করে backtracking না ছাড়াই এই বাস্তবায়ন করতে সক্ষম হতে পারেন "STRING যে সঙ্গে প্রান্ত Regex " Regex যে lookbehind অপারেটর সামনে আসে যাই হোক না কেন অংশ সঙ্গে। এই চতুর যদিও হতে কারণ lookbehind যাচ্ছে Regex ইনপুট বর্তমান শুরুতে চেয়ে আরও ফিরে দেখার প্রয়োজন হতে পারে।
নেতিবাচক লুকবিহাইড
নেতিবাচক লুকবাইন্ডের সিনট্যাক্সটি হ'ল (?<!
রেজেক্স)
। সুতরাং, উদাহরণস্বরূপ, (?<!q)u
ম্যাচগুলি u
, তবে কেবল যদি এটির আগে না হয় q
। সুতরাং এটি মেলে দিবে u
মধ্যে umbrella
এবং u
মধ্যে doubt
, কিন্তু না u
এ quick
। আবার, এই দৈর্ঘ্য গণনা করে কাজ করতে হবে বলে মনে হয় Regex , যে অনেক অক্ষর ব্যাক আপ সঙ্গে ম্যাচের জন্য পরীক্ষা Regex , কিন্তু এখন যদি lookbehind ম্যাচ পুরো ম্যাচে ব্যর্থ।
আপনি অস্বীকৃতি গ্রহণ করে backtracking ছাড়াই এই বাস্তবায়ন করতে সক্ষম হতে পারেন Regex এবং তারপর একই কাজ হিসাবে আপনি ধনাত্মক lookbehind জন্য করতে হবে।