কখন একটি রেজিপেক্স নিয়মিত এক্সপ্রেশন হয় না?


9

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

যেহেতু আমি সত্যই কোনও নিয়মিত প্রকাশ প্রকাশ করি নি, এখন, আমার প্রশ্ন:

আমি কীভাবে তাত্ক্ষণিকভাবে "সত্য" নিয়মিত অভিব্যক্তিটি দেখে কেবল তা আবিষ্কার করে সনাক্ত করতে পারি?

সংজ্ঞা: নিয়মিত প্রকাশের মাধ্যমে, আমি আনুষ্ঠানিক ভাষাগুলিতে সংজ্ঞায়িত ধারণাটি উল্লেখ করি। Regexp দ্বারা, আমি আধুনিক প্রোগ্রামিং ভাষা দ্বারা সমর্থিত ধারণাটি বোঝাতে চাইছি; regexp সিনট্যাক্সে প্রায়শই অতিরিক্ত বৈশিষ্ট্য থাকে যেমন ব্যাকরেফারেন্স। প্রোগ্রামিং ভাষাগুলিতে দেখা গেছে রেগেক্সপগুলি আনুষ্ঠানিক ভাষাগুলির নিয়মিত প্রকাশের চেয়ে শক্তিশালী


5
রেজিএক্সপ্যাক্স হ'ল নিয়মিত অভিব্যক্তির সংক্ষেপণ। প্রাথমিক সংখ্যা গণনা একটি পার্ল হ্যাকের উপর ভিত্তি করে, নিয়মিত অভিব্যক্তিতে নয়।

1
এটা বরং সহজ। নিয়মিত ভাষাগুলি সংমিশ্রণ, পুনরাবৃত্তি এবং পর্যায়ক্রমে নিয়োগ করে। যে কোনও সময় কোনও ইঞ্জিন এগুলির সমতুল্য নয় এমন কিছু সমর্থন করে, এটি নিয়মিত নয়।
কিলিয়ান ফট

1
সম্পর্কিত প্রশ্ন: 1 , 2 , 3
রাফেল

@ ইউনিস আপনি যদি বেড়ের উপরে সিএসে ঝাঁপ দেন তবে তা আর সত্য নয়। প্রোগ্রামিং ভাষাগুলিতে যেমন দেখা যায় রেগেক্সপগুলি নিয়মিত প্রকাশের চেয়ে কঠোরভাবে শক্তিশালী এবং সংক্ষিপ্ত আকারে "রেজিএক্সএক্স" সংক্ষিপ্ত আকারে হয় (আমি জানি না এটি কতটা ব্যাপকভাবে ব্যবহৃত হয়) পূর্ববর্তীটির জন্য নয় ধরনের।
রাফেল

@ কিলিয়ানফথ যদিও এটি সত্যিকারের সহায়ক বর্ণনা নয়। উদাহরণস্বরূপ, আপনি তাদের শক্তি বৃদ্ধি না করে নিয়মিত অভিব্যক্তিতে অবহেলা (বা সত্যই, বুলিয়ান সংযোগের কোনও সীমাবদ্ধ সেট) যুক্ত করতে পারেন।
ডেভিড রিচার্বি

উত্তর:


13

tl; dr backrefs।

রিজেপেক্সে একটি \1(বা এমন কোনও সংখ্যা যা ইউনিকোড থেকে বেরিয়ে আসার জন্য ব্যবহৃত হয় না) এটি কোনও নিয়মিত প্রকাশ নয়।

ব্যাকরেফস আপনাকে মেলতে দেয় (a+)b\1যা কোন n এর সাথে an এর পরে n এর সাথে aমিলিত হয় এবং কোনও এন> 1 এর জন্য n বারের সাথে মিলবে । এটি কোনও নিয়মিত ভাষা নয় (এটি কোনও নিয়মিত ভাষার পোস্টার চাইল্ড)।

এটি প্রয়োজনীয় এবং প্রায় পর্যাপ্ত যে ব্যাকরিফ একটি গ্রুপকে উল্লেখ করে যার মধ্যে একটি রেজিএক্সপ্স রয়েছে যা একটি নির্বিচারে দীর্ঘ স্ট্রিংয়ের সাথে মেলে বা এটিতে একটি *বা রয়েছে +(A)B\1A একটি সীমাবদ্ধ ভাষা যেখানে ফর্মটির একটি regexp এর একমাত্র ব্যতিক্রম (আমি খুঁজে পেয়েছি) (তাদের গ্রহণযোগ্য সমস্ত শব্দের একটি সংখ্যা দ্বারা প্রতিস্থাপিত হতে পারে)। আপনি এগুলিতে রূপান্তর করতে পারেন word1+Bword1|word2+Bword2কারণ এ সীমাবদ্ধ।

আশেপাশের গোষ্ঠীগুলি রেজিপেক্সের নিয়মিততা সরিয়ে দেয় না। A(?=B)Cregexes ক্রস অধ্যায় AB.*এবং ACএবং 2 নিয়মিত ভাষায় ক্রস অধ্যায় নিয়মিত হয়। নেতিবাচক বর্ণনাহিনী সম্পূর্ণরূপে B.*(নিয়মিত ভাষাগুলির নিয়মিত হওয়ার পরিপূরক) ব্যবহার ব্যতীত অনুরূপ । Lookbehind পাশাপাশি ঠিক একই A(?<=B)Cক্রস অধ্যায় ACএবং .*BC


এটি কি প্রয়োজনীয় এবং পর্যাপ্ত? এটি আমার কাছে দেখে মনে হচ্ছে (a)\1, ব্যাকরিফ ব্যবহার করার সময়, এটি aaতুচ্ছ নিয়মিতের সমতুল্য । আমি আরও ভাবছি যে লুক-হেডের দাবিগুলি নিয়মিত ভাষাগুলি সনাক্ত করতে ব্যবহার করতে পারে to
MSalters

1
@ এসএমএলটারস: আপনি যদি সত্যিই প্রযুক্তিগত পেতে চান (a)\1তবে এটি নিয়মিত প্রকাশ নয়, তবে একটি নিয়মিত ভাষা স্বীকৃতি দেয়।
জার্গ ডব্লু মিটাগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.