regex101 - regular expression




নিয়মিত অভিব্যক্তি সুষম বন্ধনী মেলে (10)

আপনি regex recursion ব্যবহার করতে পারেন:

\(([^()]|(?R))*\)

আমি দুটি বাইরের বন্ধনীগুলির মধ্যে সমস্ত পাঠ্য নির্বাচন করতে একটি নিয়মিত অভিব্যক্তি প্রয়োজন।

উদাহরণ: some text(text here(possible text)text(possible text(more text)))end text

ফলাফল: (text here(possible text)text(possible text(more text)))


আপনি প্রথম এবং শেষ বন্ধনী প্রয়োজন। এই মত কিছু ব্যবহার করুন:

str.indexOf ('('); - এটি আপনাকে প্রথম ঘটনাটি দেবে

str.lastIndexOf ( ')'); - সর্বশেষ

সুতরাং আপনি মধ্যে একটি স্ট্রিং প্রয়োজন,

String searchedString = str.substring(str1.indexOf('('),str1.lastIndexOf(')');

আমি এই টাস্ক দিয়ে সাহায্য করার জন্য balanced বলা একটি সামান্য জাভাস্ক্রিপ্ট লাইব্রেরি লিখেছেন। আপনি করছেন দ্বারা এই অর্জন করতে পারেন

balanced.matches({
    source: source,
    open: '(',
    close: ')'
});

আপনি প্রতিস্থাপন করতে পারেন:

balanced.replacements({
    source: source,
    open: '(',
    close: ')',
    replace: function (source, head, tail) {
        return head + source + tail;
    }
});

এখানে আরো জটিল এবং ইন্টারেক্টিভ উদাহরণ JSFiddle


উত্তরটি আপনাকে ব্রেকেটগুলির মিলযুক্ত সেটগুলির সাথে মেলে বা ইনপুট পাঠ্যের শেষ বন্ধের প্রথম খোলা থাকা প্রয়োজন কিনা তা নির্ভর করে।

যদি আপনি মিলে নেস্টেড বন্ধনীগুলির সাথে মেলে তবে আপনার নিয়মিত এক্সপ্রেশনগুলির চেয়ে আরও কিছু দরকার। - দেখুন @ ডহম্যান

যদি শেষের দিকে এটি প্রথম খোলা থাকে তবে @Zach

আপনি কি করতে চান তা নির্ধারণ করুন:

abc ( 123 ( foobar ) def ) xyz ) ghij

আপনার ক্ষেত্রে এই কোডটিতে কী মিলতে হবে তা নির্ধারণ করতে হবে।


এই উত্তরটি নিয়মিত এক্সপ্রেশনগুলি এই কাজের জন্য সঠিক সরঞ্জাম নয় কেন তাত্ত্বিক সীমাবদ্ধতা ব্যাখ্যা করে।

নিয়মিত এক্সপ্রেশন এই কাজ করতে পারে না।

নিয়মিত এক্সপ্রেশনগুলি Finite State Automata (FSA) নামে পরিচিত একটি কম্পিউটিং মডেলের উপর ভিত্তি করে তৈরি। নামটি ইঙ্গিত করে যে, একটি FSA শুধুমাত্র বর্তমান অবস্থা মনে রাখতে পারে, এটি পূর্ববর্তী রাজ্যগুলির সম্পর্কে কোন তথ্য নেই।

উপরের চিত্রটিতে, S1 এবং S2 দুটি দুটি রাজ্য যেখানে S1 শুরু এবং চূড়ান্ত পদক্ষেপ। সুতরাং যদি আমরা স্ট্রিং 0110 দিয়ে চেষ্টা করি, রূপান্তর নিম্নরূপঃ

      0     1     1     0
-> S1 -> S2 -> S2 -> S2 ->S1

উপরের ধাপে, যখন আমরা 01 0110 পর দ্বিতীয় S2 তে থাকি, তখন FSA এর আগের 0 সম্পর্কে কোন তথ্য নেই কারণ এটি শুধুমাত্র বর্তমান অবস্থা এবং পরবর্তী ইনপুট প্রতীকটি মনে রাখতে পারে।

উপরের সমস্যাতে, আমাদের বন্ধনী বন্ধ করার কোনও দরকার নেই; এর মানে এটি কিছু জায়গায় সংরক্ষণ করা আছে। কিন্তু যেহেতু FSAs করতে পারে না, একটি নিয়মিত অভিব্যক্তি লেখা যাবে না।

যাইহোক, একটি অ্যালগরিদম লক্ষ্য অর্জন করতে লেখা যেতে পারে। আলগোরিদিম সাধারণত Pushdown Automata (PDA) অধীনে পড়ে। PDA এক স্তর উপরে FSA । পিডিএ কিছু সংরক্ষণ একটি অতিরিক্ত স্ট্যাক আছে। উপরের সমস্যার সমাধান করার জন্য পিডিএগুলি ব্যবহার করা যেতে পারে, কারণ আমরা স্টকে ওপেন বন্ধনীটি ' push ' এবং 'বন্ধ' pop করতে গেলে আমরা বন্ধ বন্ধনীটি একবার ধরতে পারি। শেষ পর্যন্ত, স্ট্যাক খালি হয়, তারপর বন্ধনী বন্ধনী এবং বন্ধ বন্ধনী ম্যাচ। অন্যথায় না।

একটি বিস্তারিত আলোচনা here পাওয়া here


এই এক কাজ

re.findall(r'\(.+\)', s)

নিয়মিত এক্সপ্রেশন কাজের জন্য ভুল সরঞ্জাম কারণ আপনি নেস্টেড কাঠামো, অর্থাৎ পুনরাবৃত্তি সঙ্গে ডিল করা হয়।

কিন্তু এটি করার জন্য একটি সহজ অ্যালগরিদম রয়েছে, যা আমি এই উত্তরটিতে পূর্ববর্তী প্রশ্নের উত্তর দিয়েছি।


রুবি ব্যবহার করে নিয়মিত এক্সপ্রেশন (সংস্করণ 1.9.3 বা উপরে):

/(?<match>\((?:\g<match>|[^()]++)*\))/

রুবেল উপর ডেমো


(?<=\().*(?=\))

যদি আপনি দুটি মিলিং বন্ধনীগুলির মধ্যে পাঠ্য নির্বাচন করতে চান তবে নিয়মিত এক্সপ্রেশনগুলির মাধ্যমে আপনি ভাগ্যবান হবেন। এটি অসম্ভব (*)

এই regex শুধুমাত্র আপনার স্ট্রিং প্রথম খোলার এবং শেষ বন্ধের বন্ধনী মধ্যে টেক্সট ফেরত।

(*) আপনার রেজেক্স ইঞ্জিনটি ব্যালেন্সিং গ্রুপ বা পুনরাবৃত্তি মত বৈশিষ্ট্য না হওয়া পর্যন্ত। এমন বৈশিষ্ট্যগুলি সমর্থনকারী ইঞ্জিনগুলির সংখ্যা ধীরে ধীরে বাড়ছে, তবে তারা এখনও সাধারণভাবে উপলব্ধ নয়।


[^\(]*(\(.*\))[^\)]*

[^\(]* স্ট্রিংয়ের শুরুতে কোনও খোলার বন্ধনী নয় (\(.*\)) বন্ধনীগুলিতে আবদ্ধ প্রয়োজনীয় পদার্থ ধারণ করে এবং [^\)]* যা কিছু আছে তা মিলছে। স্ট্রিং শেষে একটি বন্ধ বন্ধনী টি। মনে রাখবেন যে এই অভিব্যক্তি বন্ধনী মেলে চেষ্টা করে না; একটি সহজ পার্সার ( ডেহম্যানের উত্তর দেখুন ) এর জন্য আরও উপযুক্ত হবে।






regex