নিয়মিত এক্সপ্রেশন আসলে কীভাবে কাজ করে?


30

বলুন আপনার রচনা রচনা সহ একটি নথি আছে। আপনি কেবলমাত্র নির্দিষ্ট শব্দ নির্বাচন করতে এই রচনাটি বিশ্লেষণ করতে চান। কুল।

ম্যাচ সন্ধানের জন্য লাইন এবং শব্দের দ্বারা ফাইল লাইনটি পার্স করার চেয়েও কি নিয়মিত এক্সপ্রেশনটি দ্রুত ব্যবহার করা হয়? যদি তা হয় তবে এটি কীভাবে কাজ করবে? আপনি প্রতিটি শব্দ দেখার চেয়ে দ্রুত কিভাবে যেতে পারেন?


5
আপনি ধরে নিলেন (শূন্য প্রমাণকে বোঝাচ্ছেন) যে একটি নিয়মিত প্রকাশ দ্রুত হবে তবে আপনি কেন জানেন না কেন এটি হয়? সম্ভবত আপনার তখন আপনার অনুমানটি পুনর্বিবেচনা করা উচিত।
পিডিআর

3
এইভাবে, অনুমান। যদি আমার কাছে প্রমাণ থাকে তবে তা এক না, তাই না?
lazeR

4
ঐটা আসল কথা না. মূল বিষয়টি আপনাকে এই অনুমানের দিকে নিয়ে যায় ... আপনার প্রশ্নগুলির জন্য আপনার কোনও প্রমাণের প্রয়োজন নেই, তবে আপনার অনুমানের জন্য যুক্তি প্রয়োজন।
ইয়ান্নিস

1
ত্রুটিযুক্ত, ইনপুট স্ট্রিংয়ের প্রতিটি চরিত্র কেবল একটি স্টেট মেশিনকে পরের অবস্থায় চালিত করে না। আমি দেখছি না যে কেউ কীভাবে এই অপারেশনটি ধীরগতিতে পেতে পারে ...
tp1

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

উত্তর:


47

এটা কিভাবে কাজ করে?

অটোমেটা তত্ত্বটি একবার দেখুন

সংক্ষেপে, প্রতিটি নিয়মিত অভিব্যক্তির সমতুল্য সসীম অটোম্যাটন থাকে এবং সীমাবদ্ধ অটোমেটনে সংকলন এবং অনুকূলিত করা যায়। জড়িত অ্যালগরিদমগুলি অনেক সংকলক বইয়ে পাওয়া যায়। এই অ্যালগরিদমগুলি ইউনিক্স এবং গ্রেপের মতো ইউনিক্স প্রোগ্রাম দ্বারা ব্যবহৃত হয়।

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

অপ্টিমাইজেশন সাধারণত আরও দক্ষ রাষ্ট্র মেশিন দেয় yield উদাহরণস্বরূপ: aaaab | aaaac | aaad বিবেচনা করুন, একটি সাধারণ প্রোগ্রামার দশ মিনিটের মধ্যেই সহজ তবে কম দক্ষ অনুসন্ধান প্রয়োগ (পৃথকভাবে তিনটি স্ট্রিং তুলনা করে) পেতে পারে; তবে এটি আআ [বিসিডি] এর সমতুল্য অনুধাবন করে, প্রথম চারটি 'এ' অনুসন্ধান করে [খ, সি, ডি] এর বিপরীতে ৫ ম চরিত্রটি পরীক্ষা করে আরও ভাল অনুসন্ধান করা যেতে পারে। অপ্টিমাইজেশনের প্রক্রিয়াটি বহু বছর আগে আমার অন্যতম সংকলক হোম ওয়ার্ক ছিল তাই আমি ধরে নিলাম এটি বেশিরভাগ আধুনিক নিয়মিত এক্সপ্রেশন ইঞ্জিনেও রয়েছে।

অন্যদিকে, রাষ্ট্রীয় মেশিনগুলি স্ট্রিং গ্রহণ করার সময় কিছুটা সুবিধা পায় কারণ তারা একটি "তুচ্ছ বাস্তবায়ন" এর তুলনায় বেশি স্থান ব্যবহার করে। এসকিউএল স্ট্রিংগুলিতে উদ্ধৃতি উদ্ধার করার জন্য একটি প্রোগ্রাম বিবেচনা করুন, যা: 1) একক উদ্ধৃতি চিহ্ন দিয়ে শুরু হয় এবং শেষ হয়; 2) একক উদ্ধৃতি চিহ্ন পরপর দুটি একক উদ্ধৃতি দ্বারা পালানো হয়। সুতরাং: ইনপুট ['a' ''] এর আউটপুট আউট করা উচিত [a ']। একটি রাষ্ট্রের মেশিনের সাহায্যে পরপর একক উদ্ধৃতি চিহ্ন দুটি রাজ্য পরিচালনা করে। এই দুটি রাজ্য ইনপুট ইতিহাস মনে রাখার উদ্দেশ্যটি পরিবেশন করে যে প্রতিটি ইনপুট অক্ষর ঠিক একবারে প্রক্রিয়া করা হয়, নিম্নলিখিত চিত্রের মতো:

...
S1->'->S2
S1->*->S1, output *, * can be any other character 
S2->'->S1, output '
S2->*->END, end the current string

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

(এমনকি স্ট্রিং অনুসন্ধানের মতো তুচ্ছ ঘটনাগুলিতেও, একটি স্মার্ট ইঞ্জিন রাষ্ট্রের মানচিত্রে একক পাথকে স্বীকৃতি দিতে পারে এবং সেই অংশটিকে একটি সাধারণ স্ট্রিং তুলনায় কমাতে এবং রাজ্যগুলি পরিচালনা করতে এড়াতে পারে))

ফ্রেমওয়ার্ক / লাইব্রেরির একটি নির্দিষ্ট ইঞ্জিন ধীর হতে পারে কারণ ইঞ্জিনটি প্রোগ্রামার সাধারণত প্রয়োজন হয় না এমন অন্যান্য কিছু কাজ করে। উদাহরণ: .NET এ রেজেক্স ক্লাস ম্যাচ, গোষ্ঠী এবং ক্যাপচার সহ বস্তুর একটি গুচ্ছ তৈরি করে create


2
এটা আমার জন্ন আনেক ভাল ছিল তা আমি বলতে পারিনি. আমি কেবল যুক্ত করব: নিয়মিত এক্সপ্রেশনগুলি অলস প্রোগ্রামারদের জন্যও তৈরি করতে পারে । উদাহরণ হিসাবে আপনি aaaab|aaaac|aaaadবনাম উল্লেখ করেছেন aaaa[bcd]। স্পষ্ট করে বলা বাহুল্য যে দু'টি গাণিতিকভাবে সমতুল্য এবং একই ডিএফএ উত্পাদন করে, এইভাবে প্রোগ্রামারদের নিয়মিত অভিব্যক্তিটি এমনভাবে উপস্থাপন করার জন্য আরও বেশি স্বাধীনতা দেয় যা বোঝার জন্য (এটি সাধারণ অভ্যাস নয়, তবে ... ইয়াক জ্ঞান)। ..
রিওয়ালক

ধন্যবাদ, আমি যে
অটোমাতা ক্লাসটি

এই একটি তুচ্ছ সমস্যা একটি উদাহরণ যেখানে Regex হয় Overkill ?: stackoverflow.com/questions/18955099/...
Menelaos Bakopoulos

17

নিয়মিত প্রকাশগুলি কেবল দ্রুত দেখায় কারণ আপনার কাছে দ্রুত কম্পিউটার রয়েছে।

১৯৮০ এর দশকে যখন 1 এমআইপিএস একটি দ্রুত কম্পিউটার ছিল, নিয়মিত প্রকাশগুলি উদ্বেগ, উদ্বেগ এবং গবেষণার মোটামুটি বড় ক্ষেত্র ছিল কারণ এগুলি ধীর এবং কুশ্রী এবং গণ্য নিবিড় ছিল। চতুর অ্যালগরিদম বিকাশ অনুসরণ করেছে এবং সহায়তা করেছে - তবে সমস্ত ব্যবহারিক কাজের জন্য আপনি আজকাল ফাটলগুলি পেরিয়ে দ্রুত মেশিনগুলির অলৌকিক ঘটনাটি দেখছেন।


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

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

আমার পয়েন্টটি কিছুটা মিস করতে পারে। এগুলি "দ্রুত" হতে পারে তবে সমস্ত আপেক্ষিককে ধন্যবাদ জানায় - এখনও অনেক কাজ বাকি আছে। এখানে অন্যান্য উত্তরগুলির কিছু পড়ার পাশাপাশি বহন করে।
তাড়াতাড়ি _

এই উত্তরটি কি প্রশ্নের সাথে সম্পর্কিত? এবং কিভাবে 13 upvotes?
সদানন্দ

7

আপনি কেন মনে করেন যে তারা নথির সন্ধানের চেয়ে দ্রুত?

কিছু কৌশল আপনি করতে পারেন যেমন, যেমন। আপনি যদি একটি 10 ​​টি শব্দের সন্ধান করছেন যা A এর সাথে শুরু হয় এবং বি দিয়ে শেষ হয় তবে আপনি যদি একটি A এবং অক্ষরটি 9 পজিশনটি আরও বি তে খুঁজে পান তবে আপনি কিছু এড়িয়ে যেতে পারেন। দেখতে Knuth-মরিস-প্র্যাট অ্যালগরিদম


5

কি নিয়মিত প্রকাশ দ্রুত করে তোলে?

আসলে, তারা না। অত বেশি না. এটি কেবলমাত্র আমাদের বেশিরভাগ লোকেরা খেয়াল করার জন্য এগুলি যথেষ্ট ধীর নয়। 'পুরানো ধীর দিনগুলিতে, এটি অনেক বেশি লক্ষণীয় ছিল।

তারা প্রতিটি কাজের জন্য হাতুড়িও সঠিক সরঞ্জাম নয়


+1 আমাকে শিল্পের সেই বিশেষ কাজের কথা মনে করিয়ে দেওয়ার জন্য ধন্যবাদ ...
ইয়ানিস

5

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


4
s / squeak / squeeze /?
প্যাটার তুরিক

4

আপনার প্রাথমিক ভিত্তি ভুল।

নিয়মিত এক্সপ্রেশন সর্বদা সাধারণ অনুসন্ধানের চেয়ে দ্রুত হয় না। এটি সব প্রসঙ্গে নির্ভর করে। এটি অভিব্যক্তির জটিলতা, নথির দৈর্ঘ্য অনুসন্ধান করা এবং সম্পূর্ণ পরিসরের কারণগুলির উপর নির্ভর করে।

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

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

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

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


1

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

গ্রহণযোগ্য - এটি যদি আসলে হয় তবে আমার কোনও ধারণা নেই।


সুন্দর! এটি আমিও বিবেচনা করেছি something তবে আজকের প্রসেসরগুলির পূর্ববর্তীদের চেয়ে দ্রুতগতির সাথে, আমি নিরাপদে বলতে পারি আপনি কোডটি দক্ষতার সাথে লিখলে, আপনি খুব কমই পৃথকটি বলতে সক্ষম হবেন। আমি আসলে পুরো নিয়মিত অভিব্যক্তিকে দ্রুত হাইপোথিসিসের উপর পুরোপুরি না! ;-)
ব্যবহারকারী 383373732
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.