নিয়মিত এক্সপ্রেশন ব্যবহার করে স্ট্রিং প্যালিনড্রোম কিনা তা কীভাবে পরীক্ষা করবেন?


94

এটি একটি সাক্ষাত্কারের প্রশ্ন ছিল যা আমি উত্তর দিতে অক্ষম ছিলাম:

নিয়মিত এক্সপ্রেশন ব্যবহার করে স্ট্রিং প্যালিনড্রোম কিনা তা কীভাবে পরীক্ষা করবেন?

PS ইতিমধ্যে একটি প্রশ্ন রয়েছে " প্রদত্ত স্ট্রিংটি প্যালিনড্রোম কিনা তা কীভাবে পরীক্ষা করবেন? " এবং এটি বিভিন্ন ভাষায় প্রচুর উত্তর দেয়, তবে নিয়মিত অভিব্যক্তি ব্যবহার করে এমন কোনও উত্তর নেই।


4
stackoverflow.com/questions/3644266/… একটি ধারণা দিতে পারে।
প্রখর

4
আজকাল (2018) এবং যারা " যে শব্দ কবিতা প্রভৃতি উলটা করিয়া পড়িলেও একই থাকে Regex" জন্য খুঁজছেন হয় জন্য PCRE সমর্থনকারী সম্পর্কে আলোচনা দেখুন রিকার্সিভ নিদর্শন Prakhar এর লিঙ্ক-এ, আর আমার রিকার্সিভ Regex নীচে তুলনা সঙ্গে
পিটার ক্রাউস

উত্তর:


153

এই প্রশ্নের উত্তর হ'ল "এটি অসম্ভব"। আরও সুনির্দিষ্টভাবে, সাক্ষাত্কারকারক ভাবছেন যে আপনি যদি আপনার কম্পিউটারের তত্ত্বের ক্লাসে মনোযোগ দিয়েছেন paid

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

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

একটি সসীম স্টেট মেশিন তৈরি করা অসম্ভব যা সমস্ত প্যালিনড্রোম গ্রহণ করে। প্রমাণটি সেই তথ্যের উপর নির্ভর করে যে আমরা সহজেই একটি স্ট্রিং তৈরি করতে পারি যার জন্য নির্বিচারে বড় সংখ্যক নোডের প্রয়োজন হয়, স্ট্রিং

a ^ xba ^ x (উদা।, আবা, আবাবা, আবাবা, আআআআআবা, ....)

যেখানে একটি ^ x হল বারবার এক্স বার। এটির জন্য কমপক্ষে এক্স নোডের প্রয়োজন কারণ 'বি' দেখার পরে আমাদের x বার পিছনে গুনতে হবে তা নিশ্চিত করার জন্য এটি একটি প্যালিনড্রোম।

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


6
@ স্টিভমোজার রুবি ১.৯.x এ নিয়মিত প্রকাশগুলি আর নিয়মিত হয় না (অটোমেটা থিওরি অর্থে) এবং সুতরাং প্যালিনড্রোমগুলি পরীক্ষা করার মতো জিনিসগুলি সম্ভব। যাইহোক, অভিপ্রায় এবং উদ্দেশ্যে, প্যালিনড্রোমগুলি নিয়মিত রেজেক্স (বুদ্ধিযুক্ত?) দিয়ে পরীক্ষা করা যায় না ।

4
@SteveMoser রুবি এর রেগুলার এক্সপ্রেশন ইঞ্জিন একটি ভালো কাজের মধ্যে থাকবেন (নেই >=1.9) এখানে

@ জন সঠিক, সুতরাং প্রশ্নের প্রেক্ষিতে জোসে সঠিক এবং এইচকিটি ভুল।
স্টিভ মোজার

4
একাডেমিক ভাষায়, একটি নিয়মিত প্রকাশের নির্দিষ্ট সীমানা থাকে (একটি ডিএফএ সংজ্ঞায়িত)। বাস্তবে, অনেকগুলি রিজএক্সএক্স ইঞ্জিন (পার্ল এবং এটির আত্মীয় প্রাথমিকভাবে) ব্যাকরেফারেন্স সমর্থন করে যা একাডেমিক সংজ্ঞা লঙ্ঘন করে (এনএফএ বা আরও বিস্তৃত হয়ে উঠছে)। সুতরাং প্রশ্নকর্তার রেফারেন্সের ফ্রেমটি কী ছিল তার উপর নির্ভর করে এই প্রশ্নের বিভিন্ন উত্তর রয়েছে।
জিগি

মৌখিক পরীক্ষায় চিড়িয়াখানা "ফরমালজ এটি অসম্ভব" নিয়ে যান তবে আপনার উল্লেখ করা উচিত যে কিছু রেজেক্স ইঞ্জিন এটির অনুমতি দেয়।
অলিভার এ।

46

যদিও পিসিআরই ইঞ্জিন নিয়মিত এক্সপ্রেশনগুলি সমর্থন করে ( পিটার ক্রাউসের উত্তর দেখুন ), অতিরিক্ত কোড ছাড়াই এটি অর্জনের জন্য আপনি আইসিইউ ইঞ্জিনের (যেমন ব্যবহৃত, উদাহরণস্বরূপ, অ্যাপল দ্বারা) একটি রেজেক্স ব্যবহার করতে পারবেন না । আপনাকে এরকম কিছু করতে হবে:

এটি কোনও প্যালিনড্রোম সনাক্ত করে তবে এর জন্য একটি লুপ প্রয়োজন (যা প্রয়োজন হবে কারণ নিয়মিত প্রকাশগুলি গণনা করতে পারে না)।

$a = "teststring";
while(length $a > 1)
{
   $a =~ /(.)(.*)(.)/;
   die "Not a palindrome: $a" unless $1 eq $3;
   $a = $2;
}
print "Palindrome";

4
ভাল উত্তর. প্রশ্নটি কোনও একক রেজিএক্সপ্যাকের জন্য জিজ্ঞাসা করেনি যা বাক্সের বাইরে সরাসরি একটি প্যালিনড্রোম সনাক্ত করে - এটি কেবলমাত্র প্যালিনড্রোমগুলি সনাক্ত করার একটি পদ্ধতির জন্য জিজ্ঞাসা করেছিল যা রিজেক্সপস ব্যবহার করে। এটি এইভাবে দেখার জন্য আপনার অন্তর্দৃষ্টি সম্পর্কে অভিনন্দন।
স্টুয়ার্ট

4
কেবলমাত্র একটি রেইজেক্স ব্যবহার করে সবচেয়ে সহজ ম্যাচিং (স্ট্রিং ম্যানিপুলেশন ছাড়াই) দেখুন স্ট্যাকওভারফ্লো.
পিটার ক্রাউস

ধন্যবাদ @ পিটারক্রস। জানতাম না যে পিসিআরই পুনরাবৃত্তি হয়েছিল। আপনার উত্তর রেফারেন্স।
এয়ারসোর্স লিমিটেড

32

এটা সম্ভব না. প্যালিনড্রোমগুলি একটি নিয়মিত ভাষা দ্বারা সংজ্ঞায়িত হয় না। (দেখুন, আমি গণনা তত্ত্বের কিছু শিখেছি)


4
বেশিরভাগ নিয়মিত এক্সপ্রেশন ইঞ্জিনগুলি নিয়মিত ভাষার চেয়ে বেশি ক্যাপচার করে (উদাহরণস্বরূপ নেট ম্যাচিং প্রথম বন্ধনী ক্যাপচার করতে পারে)। কেবলমাত্র স্ট্যান্ডার্ড রেজেক্সগুলি নিয়মিত ল্যাংগুলিতে সীমাবদ্ধ।
সান্তিয়াগো প্যালাদিনো

প্রশ্নটি যদিও "নিয়মিত অভিব্যক্তি" শব্দটি ব্যবহার করেছে ... সুতরাং ZCHudson এর উত্তরটি সঠিক answer
paxos1977

4
@ অস্টির্গ: জেডএইচচডসনের উত্তরটি সঠিক তবে অসম্পূর্ণ। আধুনিক প্রোগ্রামিং ভাষাগুলিতে নিয়মিত প্রকাশ এবং তাত্ত্বিক সিএস ক্লাসে ব্যবহৃত নিয়মিত প্রকাশগুলি হ'ল বিভিন্ন জন্তু। শব্দটি কেবল একটি .তিহাসিক .তিহ্য। দেখুন stackoverflow.com/questions/233243#235199 এবং আমার উত্তর।
jfs

4
@ জেএফ সেবাস্তিয়ান - আমাকে এ বিষয়ে কৌতূহলের সাথে একমত হতে হবে। যখন নিয়মিত এক্সপ্রেশন শব্দটি ব্যবহার করা হয় কম কম্পিউটার বিজ্ঞানের তুলনায় উল্লিখিত নির্দিষ্ট প্রোগ্রামিং ভাষা ব্যতীত ব্যবহার করা হয়। সমস্ত ভাষা যা রেজেক্সগুলিকে সমর্থন করে তারা এটি করতে পারে না, তাই আমাদের এখানে ব্যবহার করা ভাষাটি অনুমান করা উচিত নয়।
রেন্টোলজিস্ট

@ র‌্যান্টোলজিস্ট: আমি প্রশ্নে প্রোগ্রামিং ভাষার পছন্দ বাছাইয়ের ক্ষেত্রে কোনও বিধিনিষেধ দেখছি না সুতরাং কোনও ভাষার অনুমতি রয়েছে। ডানদিকে দেখুন: সম্পর্কিত প্রশ্নগুলিতে "নিয়মিত প্রকাশ" এর অর্থ কী? এর মধ্যে কারও মধ্যে নির্দিষ্ট প্রোগ্রামিং ভাষার উল্লেখ রয়েছে?
jfs

27

পার্ল রেজেক্স সহ:

/^((.)(?1)\2|.?)$/

যদিও, অনেকে উল্লেখ করেছেন, আপনি কঠোর হতে চাইলে এটিকে একটি নিয়মিত প্রকাশ হিসাবে বিবেচনা করা যাবে না। নিয়মিত প্রকাশগুলি পুনরাবৃত্তি সমর্থন করে না।


এটি পিসিআরই তে কাজ করে না (এটি "আববা" এর সাথে মেলে না) তবে এটি পার্ল ৫.১০
তে

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

4
আশ্চর্যজনকভাবে, অ লাতিন ভাষার জন্য কাজ করে না, উদাহরণস্বরূপ আর্মেনিয়ান ভাষা।
তেমুজিন

4
@ টিমুজিন এটি হয় কারণ ইউনিকোডের অক্ষরগুলি এনকোডড বাইট ( /uসংশোধক যুক্ত ) হিসাবে মিলিত হয় , বা সংযুক্তিযুক্ত অক্ষরগুলির কারণে। (প্রতিস্থাপন .সঙ্গে \Xপালাবার ক্রম )।
মার্কাস জারদারোট

4
আমার প্যাটার্নটি পিসিআরই তে কাজ করে না। এটি পার্লে কাজ করে। সাবস্ট্রিংগুলি পুনরাবৃত্তি করা হলে আপনার প্যাটার্ন ব্যর্থ হয়। উদাহরণস্বরূপ abababa। পিসিআরই ভিত্তিক রেজেক্স ইঞ্জিনগুলি ব্যবহার করার সময় প্রতিটি ইনপুটটির জন্য এটি পুনরাবৃত্তি নিয়ে কাজ করা সম্ভব নয়। পুনরাবৃত্তি এবং পরিবর্তনীয় স্থিতি ব্যবহার করে ক্যাসিমিরস রেজেেক্স একটি ভিন্ন পদ্ধতির ব্যবহার করে এবং বেশ আকর্ষণীয়।
মার্কাস জারদারোট

15

যে কোনও ধরণের চরিত্রের জন্য 4-বর্ণের প্যালিনড্রোমগুলি সনাক্তকরণের জন্য এখানে (উদাহরণস্বরূপ: দলিল):

\(.\)\(.\)\2\1

5-বর্ণের প্যালিনড্রোমগুলি সনাক্তকরণের জন্য এখানে একটি (উদাহরণস্বরূপ: রাডার) কেবলমাত্র অক্ষরের জন্য অনুসন্ধান করা হচ্ছে:

\([a-z]\)\([a-z]\)[a-z]\2\1

সুতরাং দেখে মনে হচ্ছে প্রতিটি সম্ভাব্য শব্দের দৈর্ঘ্যের জন্য আমাদের আলাদা রেজেেক্স দরকার। পাইথন মেলিং তালিকার এই পোস্টে কেন (ফিনিট স্টেট অটোমেটা এবং পাম্পিং লেমায়) কিছু বিশদ রয়েছে।


14

আপনি কতটা আত্মবিশ্বাসী তার উপর নির্ভর করে আমি এই উত্তরটি দেব:

আমি এটি একটি নিয়মিত প্রকাশের সাথে করব না। এটি নিয়মিত প্রকাশের উপযুক্ত ব্যবহার নয়।


4
আমি আশা করবো আপনি রেজেক্সের সীমাবদ্ধতাগুলি সত্যই বুঝতে পেরেছেন তা দেখানোর জন্য আপনি আরও কিছুটা ব্যাখ্যা দিতে চাই। আপনার সহজ উত্তরটি "আমি স্ট্যাম্পড" হিসাবে নেওয়া যেতে পারে।
স্কট ওয়েগনার

অতএব নির্ভরতা তিনি দিয়েছেন।
উইকডফোর্ড 21

13

হ্যাঁ , আপনি এটি করতে পারেন। নেট!

(?<N>.)+.?(?<-N>\k<N>)+(?(N)(?!))

আপনি এটি এখানে পরীক্ষা করতে পারেন ! এটি একটি দুর্দান্ত পোস্ট!


.NET স্বাদযুক্ত রেজেক্সের পুরো বিষয়টি হ'ল এগুলি নিয়মিত নয় কারণ তারা সীমাবদ্ধ রাষ্ট্র স্বয়ংক্রিয়তা নয়; তাত্ত্বিক অর্থে তারা প্রকৃতপক্ষে রেজেক্স নয়।
বিড়াল

12

স্ট্যাকওভারফ্লো "নিয়মিত এক্সপ্রেশন? না, যেমন উত্তরগুলি পূর্ণ, তারা এটিকে সমর্থন করে না They তারা এটিকে সমর্থন করতে পারে না " "

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

পার্ল নিজেই নির্মাতা ল্যারি ওয়াল থেকে একটি উদ্ধৃতি এখানে :

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

এবং এখানে একটি ব্যাপার ব্লগ পোস্ট দ্বারা পিএইচপি কোর ডেভেলপারদের এক :

নিবন্ধটি বেশ দীর্ঘ হওয়ায় এখানে মূল বিষয়গুলির সংক্ষিপ্তসার:

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

বলা হচ্ছে, আপনি এটি ব্যবহার করে প্যালিনড্রোমগুলি রেগেক্সগুলির সাথে মেলাতে পারেন:

^(?'letter'[a-z])+[a-z]?(?:\k'letter'(?'-letter'))+(?(letter)(?!))$

... যা নিয়মিত ব্যাকরণের সাথে স্পষ্টতই কিছু করার নেই।
এখানে আরও তথ্য: http://www.regular-expressions.info/balancing.html


9

যেমনটি কয়েকজন ইতিমধ্যে বলেছে, এমন কোনও একক রেজিএক্সপক্স নেই যা বাক্সের বাইরে কোনও সাধারণ প্যালিনড্রোম সনাক্ত করবে, তবে আপনি যদি নির্দিষ্ট দৈর্ঘ্য পর্যন্ত প্যালিনড্রোমগুলি সনাক্ত করতে চান তবে আপনি এর মতো কিছু ব্যবহার করতে পারেন

(.?)(.?)(.?)(.?)(.?).?\5\4\3\2\1

7

এটি এখন পার্লে করা যেতে পারে। পুনরাবৃত্ত তথ্যসূত্র ব্যবহার করে:

if($istr =~ /^((\w)(?1)\g{-1}|\w?)$/){
    print $istr," is palindrome\n";
}

নিকটবর্তী শেষ অংশের উপর ভিত্তি করে সংশোধন করা হয়েছে http://perldoc.perl.org/perlretut.html


6

রুবিতে আপনি নামধারী ক্যাপচার গ্রুপগুলি ব্যবহার করতে পারেন। সুতরাং এর মতো কিছু কাজ করবে -

def palindrome?(string)
  $1 if string =~ /\A(?<p>| \w | (?: (?<l>\w) \g<p> \k<l+0> ))\z/x
end

এটি চেষ্টা করুন, এটি কাজ করে ...

1.9.2p290 :017 > palindrome?("racecar")
 => "racecar" 
1.9.2p290 :018 > palindrome?("kayak")
 => "kayak" 
1.9.2p290 :019 > palindrome?("woahitworks!")
 => nil 

4
নামকৃত ক্যাপচার গ্রুপগুলি কঠোরভাবে রেজিজেস নয়। willamette.edu/~fruehr/LLC/lab5.html
স্টিভ মোজার

4
আপনি সঠিক. আমি বিশেষভাবে কেন উল্লেখ করেছি যে আপনার নামকৃত ক্যাপচার গ্রুপগুলি ব্যবহার করতে হবে।
টেলর

যে কোনও সুযোগে কোনও নবজাতকের জন্য চরিত্র অনুসারে আরই চরিত্রটি ব্যাখ্যা করতে পারে? আমি নীচের সমস্তটি বুঝতে পারি (কমাগুলি 'পরমাণুগুলিকে পৃথক করে') /, \ এ, (, |, \ ডাব্লু, এগুলির কোনও কিছুই বুঝতে পারছি না? <p>,?:, <l>, \ g <p>, \ k <l + 0> এবং আমি সাহায্যের জন্য রুবুলার ডট কম ব্যবহার করছি এবং এটি আরআর বুঝতে পারে বলে মনে হচ্ছে ( প্রাকৃতিকভাবে), তবে এটি আমাকে এটি দেখতে সহায়তা করে না এবং এমনকি "একটি সম্পূর্ণ রুবি রেজেক্স গাইডের জন্য, পিক্যাক্স দেখুন।" সাহায্য করবে না, কারণ 'পিকাক্সে'র সাথে সংযুক্ত সাইটটি আমি বুঝতে পারছি না এমন পরমাণুগুলি ব্যাখ্যা করে না। আমি জানি ? শূন্য বা একটির একটি ম্যাচ অনুসরণ করছেন, তবে? একটি চরিত্রের আগে?
কেভিন ফোর্ড সাবমেরিনার

আহ, নাম ক্যাপচার গ্রুপ ! ভাল লাগল @ স্টেভমোজার এটি এখন একটি ভাঙা লিঙ্ক, তবে আমি অন্য একটি সন্ধান পেয়েছি । তাদের উল্লেখ করার জন্য টেলরকে ধন্যবাদ, অন্যথায়, আমি কি জানতাম না যে? <p> এবং? <l> এবং?: (ক্যাপচারকারী গ্রুপ নয়) এবং \ g <p> এবং \ কে <এল + এর অর্থ কী? 0>। আমি এখনও কি দেখতে পাচ্ছি না? <p> | যদিও। না | মানে "বা"? আরইএসে পাইপের জন্য সেই ব্যবহারের নথিপত্র খুঁজে পাই না। আমি এখনও এই খুব সুন্দর আরআর জন্য একটি বিশদ বিবরণ দেখতে আনন্দিত হবে।
কেভিন ফোর্ড সাবমেরিনার

6

আপনি পুনরাবৃত্তি ব্যবহার না করে এটিও করতে পারেন:

\A(?:(.)(?=.*?((?(2)\1\2|\1))\z))*?.?\2\z

একটি একক অক্ষর অনুমতি দিতে:

\A(?:(?:(.)(?=.*?((?(2)\1\2|\1))\z))*?.?\2|.)\z

পার্ল, পিসিআরই নিয়ে কাজ করে

ডেমো

জাভার জন্য:

\A(?:(.)(?=.*?(\1\2\z|(?<!(?=\2\z).{0,1000})\1\z)))*?.?\2\z

ডেমো


4
এটি একটি রেজেক্স প্রশ্নের খুব আকর্ষণীয় উত্তর। আসলে একমাত্র প্যাটার্ন, এটি আমার কিছু পরীক্ষায় উত্তীর্ণ হয়েছিল । এই এক কাসিমিরের জন্য ধন্যবাদ :)
বকবক বুদবুদ

4
@ বুবলবল: আপনার সমর্থনের জন্য ধন্যবাদ আপনি দেখতে পাচ্ছেন, আমি সম্প্রতি এই উত্তরটি সম্পাদনা করেছি কারণ পূর্ববর্তী সংস্করণটি ভুল ছিল (তিন বছরের জন্য, কী লজ্জাজনক)।
ক্যাসিমির এবং

5

এটি নিয়মিত প্রকাশের চেয়ে স্ট্রিং ম্যানিপুলেশন দিয়ে করা আসলেই সহজ:

bool isPalindrome(String s1)

{

    String s2 = s1.reverse;

    return s2 == s1;
}

আমি বুঝতে পেরেছি যে এটি সত্যিই সাক্ষাত্কার প্রশ্নের উত্তর দেয় না, তবে আপনি কীভাবে কোনও কাজ করার আরও ভাল উপায় জানেন তা দেখানোর জন্য আপনি এটি ব্যবহার করতে পারেন, এবং আপনি সাধারণ "হাতুড়িযুক্ত ব্যক্তি" নন, যিনি প্রতিটি সমস্যা পেরেক হিসাবে দেখেন "


যদিও আমি এই উত্তরের বেশ পছন্দ, আমি মনে করি আপনি ব্রেকআইট্রেটর ব্যবহার করে স্ট্রিংটিকে ভিজ্যুয়াল অক্ষরগুলিতে যথাযথভাবে বিভক্ত করার জন্য অতিরিক্ত পয়েন্ট পাবেন।
ট্রেজকাজ 20'14

5

রেগেক্স গল্ফের 5 তম স্তরের আমার উত্তর (একজন মানুষ, একটি পরিকল্পনা) এখানে। এটি ব্রাউজারের Regexp (আমি ক্রোম 36.0.1985.143 ব্যবহার করছি) এর সাথে 7 টি পর্যন্ত অক্ষরের জন্য কাজ করে।

^(.)(.)(?:(.).?\3?)?\2\1$

এখানে 9 টি চরিত্রের জন্য একটি

^(.)(.)(?:(.)(?:(.).?\4?)?\3?)?\2\1$

এটি যে পরিমাণ অক্ষরের জন্য কাজ করবে সেটি বাড়ানোর জন্য, আপনি বারবার প্রতিস্থাপন করবেন ? সঙ্গে (: () \ N।।?)?


4
আমি সেটিকে সামান্য কম অক্ষরের সাথে পরিচালনা করেছি, ^ (।) (।) (।)?।? \ 3 \ 2 \ 1 $
বেন এলিস

আমার কাছে এটি নষ্ট করার জন্য অনেক ধন্যবাদ :-)
ইউ 10-ফরোয়ার্ড

বাকী লোকের কেন 13 টি আছে তবে এটি 19
U10-ফরওয়ার্ড

5

রিকার্সিভ নিয়মিত এক্সপ্রেশনগুলি এটি করতে পারে!

একটি প্যালিনড্রোমযুক্ত একটি স্ট্রিং সনাক্ত করতে এত সহজ এবং স্ব-স্পষ্টত অ্যালগরিদম:

   (\w)(?:(?R)|\w?)\1

rexegg.com/regex-recursion টিউটোরিয়াল ব্যাখ্যা কিভাবে এটি কাজ করে।


এটি যে কোনও ভাষার সাথে কাজ করে, এখানে পিএইচপি ব্যবহার করে একই উত্স (লিঙ্ক) থেকে প্রুফ-অফ-কনসেপ্ট হিসাবে রূপান্তরিত একটি উদাহরণ রয়েছে:

$subjects=['dont','o','oo','kook','book','paper','kayak','okonoko','aaaaa','bbbb'];
$pattern='/(\w)(?:(?R)|\w?)\1/';
foreach ($subjects as $sub) {
  echo $sub." ".str_repeat('-',15-strlen($sub))."-> ";
  if (preg_match($pattern,$sub,$m)) 
      echo $m[0].(($m[0]==$sub)? "! a palindrome!\n": "\n");
  else 
      echo "sorry, no match\n";
}

ফলাফল

dont ------------> sorry, no match
o ---------------> sorry, no match
oo --------------> oo! a palindrome!
kook ------------> kook! a palindrome!
book ------------> oo
paper -----------> pap
kayak -----------> kayak! a palindrome!
okonoko ---------> okonoko! a palindrome!
aaaaa -----------> aaaaa! a palindrome!
bbbb ------------> bbb

তুলনা

নিয়মিত এক্সপ্রেশন ^((\w)(?:(?1)|\w?)\2)$ একই কাজ করে তবে হ্যাঁ / পরিবর্তে "অন্তর্ভুক্ত" নয়।
পিএস: এটি এমন সংজ্ঞা ব্যবহার করছে যেখানে "ও" প্যালিমব্রোম নয়, "সক্ষম-এলবা" হাইফেনড ফর্ম্যাটটি প্যালিনড্রোম নয়, তবে "সক্ষমেলবা" is নামকরণ এটি সংজ্ঞা 1
যখন "ও" এবং "সক্ষম-এলবা" প্যালিনড্রোন হয়, নামকরণ সংজ্ঞা 2

অন্য একটি "প্যালিনড্রোম রেজেক্সেস" এর সাথে তুলনা করা,

  • ^((.)(?:(?1)|.?)\2)$\w"সক্ষম-এলবা" স্বীকার করে কোনও বাধা ছাড়াই উপরের বেস-রেজেক্স ।

  • ^((.)(?1)?\2|.)$( @ লিলডেভিল ) সংজ্ঞা 2 ব্যবহার করুন ("ও" এবং "সক্ষম-এলবা" গ্রহণ করুন যাতে "আআআআআ" এবং "বিবিবিবি" স্ট্রিংগুলির স্বীকৃতি অনুসারে পৃথক হয়)।

  • ^((.)(?1)\2|.?)$( @ মারকাস ) "কুক" সনাক্ত করে না "বিবিবিবি"

  • ^((.)(?1)*\2|.?)$( @ সিসবা ) সংজ্ঞা 2 ব্যবহার করুন ।


দ্রষ্টব্য: তুলনা করতে আপনি $subjectsপ্রতিটি তুলনামূলক রেজেক্সের জন্য আরও শব্দ এবং একটি লাইন যুক্ত করতে পারেন ,

  if (preg_match('/^((.)(?:(?1)|.?)\2)$/',$sub)) echo " ...reg_base($sub)!\n";
  if (preg_match('/^((.)(?1)?\2|.)$/',$sub)) echo " ...reg2($sub)!\n";
  if (preg_match('/^((.)(?1)\2|.?)$/',$sub)) echo " ...reg3($sub)!\n";
  if (preg_match('/^((.)(?1)*\2|.?)$/',$sub)) echo " ...reg4($sub)!\n";

আমি এটি চেষ্টা করেছিলাম এবং মনে হচ্ছে এটি সমস্ত প্যালিনড্রোমের সাথে মেলে:^((.)(?:(?1)|.?)\2|(.)\3*)$
হাও উউ

4

পিসিআরই এক্সপ্রেশন সম্পর্কিত (মিজার্ডএক্স থেকে):

/^((.)(?1)\2ype.?)$/

আপনি এটি পরীক্ষা করেছেন? উইন এক্সপি প্রো এর অধীনে আমার পিএইচপি 5.3 এ এটি ব্যর্থ হয়: আয়াবা আসলে, আমি প্রকাশের অভিব্যক্তিটি কিছুটা পরিবর্তন করেছি, পড়তে:

/^((.)(?1)*\২ype.?)$/

আমি মনে করি যা ঘটছে তা হ'ল বাইরের চরিত্রগুলি নোঙ্গর করা অবস্থায় বাকি অভ্যন্তরগুলি নেই। এটি পুরো পুরো উত্তর নয় কারণ এটি ভুলভাবে "আবা" এবং "আবাচা" এর উপর দিয়ে যায়, তবে এটি "আবাচাক" -এ সঠিকভাবে ব্যর্থ হয়।

আমি ভাবছি যে এর কোনও সমাধান আছে কিনা, এবং এছাড়াও, পার্ল উদাহরণ (জেএফ সেবাস্তিয়ান / জেডসোল্ট দ্বারা) আমার পরীক্ষাগুলি সঠিকভাবে পাস করে?

ভিয়েনার সিএসবা গাবর or




2

জেডএইচডসন দ্বারা নির্দেশিত হিসাবে, প্যালিনড্রোমের সেটটি কোনও নিয়মিত ভাষা না হওয়ায় কোনও সাধারণ পেলিনড্রোম কোনও সাধারণ রেইগ এক্সপ দিয়ে করা যায় না তা নির্ধারণ করুন।

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



2

আমি সাক্ষাত্কারকারীর কাছে ব্যাখ্যা করব যে প্যালিনড্রোম সমন্বিত ভাষা কোনও নিয়মিত ভাষা নয় বরং পরিবর্তে প্রসঙ্গমুক্ত।

নিয়মিত প্রকাশ যা সমস্ত প্যালিনড্রোমের সাথে মেলে তা অসীম হবে । পরিবর্তে আমি পরামর্শ দেব তিনি গ্রহণের জন্য নিজেকে সর্বোচ্চ আকারের প্যালিনড্রোমে সীমাবদ্ধ রাখুন; বা যদি সমস্ত প্যালিনড্রোমগুলি ন্যূনতম কিছু প্রকারের এনডিপিএ ব্যবহারের প্রয়োজন হয়, বা কেবল সরল স্ট্রিংটি বিপরীত / সমান কৌশলটি ব্যবহার করে।


2

ক্যাপচার গ্রুপগুলি শেষ হয়ে যাওয়ার আগে আপনি রেজিজেসগুলির সাথে সর্বোত্তম করতে পারেন:

/(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?).?\9\8\7\6\5\4\3\2\1/

এটি দৈর্ঘ্যে 19 টি অক্ষরের সমস্ত প্যালিনড্রোমের সাথে মিলবে।

সকল দৈর্ঘ্যের জন্য প্রোগ্রামারিকভাবে সমাধান করা তুচ্ছ:

str == str.reverse ? true : false

আপনার রেজেক্স কাজ করে না। উদাহরণস্বরূপ, এটি ইঙ্গিত করবে যে "অ্যাবাক" ম্যাচ ...
ডারউইন

2

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

/^((.)(?1)?\2|.)$/

আপনি যদি এটি অন্য কোনও স্ট্রিংয়ে ব্যর্থ করতে পারেন তবে মন্তব্য করুন।


2
#!/usr/bin/perl

use strict;
use warnings;

print "Enter your string: ";
chop(my $a = scalar(<STDIN>));    
my $m = (length($a)+1)/2;
if( (length($a) % 2 != 0 ) or length($a) > 1 ) { 
  my $r; 
  foreach (0 ..($m - 2)){
    $r .= "(.)";
  }
  $r .= ".?";
  foreach ( my $i = ($m-1); $i > 0; $i-- ) { 
    $r .= "\\$i";
  } 
  if ( $a =~ /(.)(.).\2\1/ ){
    print "$a is a palindrome\n";
  }
  else {
    print "$a not a palindrome\n";
 }
exit(1);
}
print "$a not a palindrome\n";

2

অটোমাতা তত্ত্ব থেকে কোনও দৈর্ঘ্যের প্যালিয়ন্ড্রোমের সাথে মিল পাওয়া অসম্ভব (কারণ এর জন্য স্মৃতিতে অসীম পরিমাণ প্রয়োজন)। তবে এটি নির্ধারিত দৈর্ঘ্যের প্যালিয়ন্ড্রোমগুলির সাথে মেলে OS একটি রেজেেক্স লিখতে এটি বলুন যা দৈর্ঘ্যের সমস্ত প্যালিয়ন্ড্রোমের সাথে মিলে যায় <= 5 বা <= 6 ইত্যাদির সাথে, তবে> = 5 ইত্যাদি নয় যেখানে উপরের সীমাটি অস্পষ্ট is


2

রুবিতে আপনি \b(?'word'(?'letter'[a-z])\g'word'\k'letter+0'|[a-z])\bপ্যালিনড্রোম শব্দের সাথে মেলে ব্যবহার করতে পারেন a, dad, radar, racecar, and redivider। PS: এই রেজেক্স কেবল প্যালিনড্রোম শব্দের সাথে মেলে যা একটি বিজোড় সংখ্যক বর্ণের দীর্ঘ।

আসুন দেখি কীভাবে এই রেজেক্স রাডারটি মেলে। বাউন্ডারি \ বি শব্দটি স্ট্রিংয়ের শুরুতে মেলে। রেজেক্স ইঞ্জিন ক্যাপচারিং গ্রুপটিতে "শব্দ" প্রবেশ করে। [এজে] আর এর সাথে মেলে যা পুনরায়বৃত্তি স্তর শূন্যে ক্যাপচারিং গ্রুপ "চিঠি" এর জন্য স্ট্যাকের মধ্যে সংরক্ষণ করা হয়। এখন রেজেক্স ইঞ্জিন গ্রুপ "শব্দ" এর প্রথম পুনরাবৃত্তিতে প্রবেশ করে। (? 'চিঠি' [আজ]] মিলন করে এবং পুনরাবৃত্তির স্তরের একটিকে ক্যাপচার করে। রেজেক্স গ্রুপ "শব্দ" এর দ্বিতীয় পুনরাবৃত্তি প্রবেশ করে। (? 'চিঠি' [আজ]] পুনরাবৃত্তির স্তরে দুটি ধারন করে। পরবর্তী দুটি পুনরাবৃত্তি চলাকালীন, গ্রুপটি তিন এবং চার স্তরের একটি এবং আর ক্যাপচার করে। পঞ্চম পুনরাবৃত্তি ব্যর্থ হয়েছে কারণ [অ্যাজ] মেলে যাওয়ার জন্য স্ট্রিংয়ে কোনও অক্ষর নেই। রেজেক্স ইঞ্জিন অবশ্যই ব্যাকট্র্যাক করবে।

রেজেক্স ইঞ্জিনকে এখন গ্রুপ "শব্দ" এর মধ্যে দ্বিতীয় বিকল্পটি চেষ্টা করতে হবে। রেজেক্সে দ্বিতীয় [এজেড] স্ট্রিংয়ের সাথে চূড়ান্ত আর এর সাথে মেলে। ইঞ্জিনটি এখন একটি সফল পুনরাবৃত্তি থেকে প্রস্থান করে, এক স্তর পিছনে তৃতীয় পুনরাবৃত্তি পর্যন্ত যায়।

(& শব্দ) মিলে যাওয়ার পরে ইঞ্জিনটি \ কে'লেটার + 0 'এ পৌঁছায়। ব্যাকেরেফারেন্স ব্যর্থ হয়েছে কারণ রেজেেক্স ইঞ্জিন ইতিমধ্যে সাবজেক্টের স্ট্রিংয়ের শেষে পৌঁছেছে। সুতরাং এটি আরও একবার ব্যাকট্র্যাক করে। দ্বিতীয় বিকল্প এখন মেলে একটি। রেজেক্স ইঞ্জিন তৃতীয় পুনরাবৃত্তি থেকে প্রস্থান করে।

রেজেক্স ইঞ্জিনটি আবার (& শব্দ) সাথে মিলেছে এবং আবার পিছনে চেষ্টা করার প্রয়োজন needs ব্যাকেরেফারেন্সটি 0 বা পুনরাবৃত্তির বর্তমান স্তরকে নির্দিষ্ট করে, যা ২ this ব্যাকরেফারেন্স ব্যর্থ হয় কারণ স্ট্রিংয়ের পরবর্তী অক্ষরটি r হয়। আবার ব্যাকট্র্যাকিং, দ্বিতীয় বিকল্প ম্যাচ d।

এখন, \ k'letter + 0 'স্ট্রিংয়ের সাথে দ্বিতীয়টির সাথে মেলে। এজন্য যে রেজেক্স ইঞ্জিনটি প্রথম পুনরাবৃত্তির সময় ফিরে এসেছিল যার সময় ক্যাপচারিং গ্রুপটি প্রথমটির সাথে মিলেছিল। রেজেক্স ইঞ্জিনটি প্রথম পুনরাবৃত্তিটি থেকে বেরিয়ে আসে।

রেজেক্স ইঞ্জিনটি এখন সমস্ত পুনরাবৃত্তির বাইরে এসেছে। এই স্তরটি, ক্যাপচারিং গ্রুপটি সংরক্ষণ করে। Backreferences এখন স্ট্রিং মধ্যে চূড়ান্ত আর মেলাতে পারেন। ইঞ্জিন যেহেতু আর কোনও পুনরাবৃত্তির ভিতরে নেই, তাই এটি গ্রুপের পরে রেগেক্সের বাকী অংশের সাথে এগিয়ে যায়। \ b স্ট্রিংয়ের শেষে মিলছে। রেজেক্সের শেষে পৌঁছে যায় এবং সামগ্রিক ম্যাচ হিসাবে রাডার ফিরে আসে।


2

এখানে পিএল / এসকিউএল কোড রয়েছে যা জানায় যে প্রদত্ত স্ট্রিংটি প্যালিনড্রোম কিনা বা নিয়মিত এক্সপ্রেশন ব্যবহার করে না:

create or replace procedure palin_test(palin in varchar2) is
 tmp varchar2(100);
 i number := 0;
 BEGIN
 tmp := palin;
 for i in 1 .. length(palin)/2 loop
  if length(tmp) > 1 then  
    if regexp_like(tmp,'^(^.).*(\1)$') = true then 
      tmp := substr(palin,i+1,length(tmp)-2);
    else 
      dbms_output.put_line('not a palindrome');
      exit;
    end if;
  end if;  
  if i >= length(palin)/2 then 
   dbms_output.put_line('Yes ! it is a palindrome');
  end if;
 end loop;  
end palin_test;

2
my $pal='malayalam';

while($pal=~/((.)(.*)\2)/){                                 #checking palindrome word
    $pal=$3;
}
if ($pal=~/^.?$/i){                                         #matches single letter or no letter
    print"palindrome\n";
}
else{
    print"not palindrome\n";
}

4
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং / বা কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে।
ডোনাল্ড ডাক

2

এই রেজেক্স স্পেস, ট্যাব, কমা এবং কোট উপেক্ষা করে 22 টি অক্ষর পর্যন্ত প্যালিনড্রোম সনাক্ত করবে।

\b(\w)[ \t,'"]*(?:(\w)[ \t,'"]*(?:(\w)[ \t,'"]*(?:(\w)[ \t,'"]*(?:(\w)[ \t,'"]*(?:(\w)[ \t,'"]*(?:(\w)[ \t,'"]*(?:(\w)[ \t,'"]*(?:(\w)[ \t,'"]*(?:(\w)[ \t,'"]*(?:(\w)[ \t,'"]*\11?[ \t,'"]*\10|\10?)[ \t,'"]*\9|\9?)[ \t,'"]*\8|\8?)[ \t,'"]*\7|\7?)[ \t,'"]*\6|\6?)[ \t,'"]*\5|\5?)[ \t,'"]*\4|\4?)[ \t,'"]*\3|\3?)[ \t,'"]*\2|\2?))?[ \t,'"]*\1\b

এটি এখানে খেলুন: https://regexr.com/4tmui


0

সিউডোকোডে এয়ারসোর্স লিমিটেডের পদ্ধতির সামান্য পরিমার্জন:

WHILE string.length > 1
    IF /(.)(.*)\1/ matches string
        string = \2
    ELSE
        REJECT
ACCEPT
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.