সীমানা ছাড়ার সময় দুটি অক্ষরের মধ্যে অন্তর্ভুক্ত একটি স্ট্রিং সন্ধান করার জন্য নিয়মিত অভিব্যক্তি


294

আমাকে একটি স্ট্রিং থেকে অক্ষরগুলির একটি সেট বের করতে হবে যা দুটি ডিলিমিটারের মধ্যে অন্তর্ভুক্ত থাকে, নিজেরাই ডেলিফিটরকে না ফিরিয়ে।

একটি সাধারণ উদাহরণ সহায়ক হতে হবে:

লক্ষ্য : বন্ধনী নিজেরাই না ফিরিয়ে স্কোয়ার বন্ধনীগুলির মধ্যে সাবস্ট্রিংটি বের করুন।

বেস স্ট্রিং :This is a test string [more or less]

আমি যদি নিম্নলিখিত রেগ ব্যবহার করি। প্রাক্তন।

\ [। * \]

ম্যাচটি হ'ল [more or less]। আমাকে কেবল more or less(বন্ধনী ছাড়া) পেতে হবে।

এটা কি সম্ভব?


উত্তর:


452

সহজ সম্পন্ন:

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

প্রযুক্তিগতভাবে এটি লুক হেডস এবং লুকবিহিন্ড ব্যবহার করছে। লুকোহেড এবং লুকোহাইন্ডের জিরো-প্রস্থের বিবরণগুলি দেখুন । প্যাটার্নটি নিয়ে গঠিত:

  • এর পূর্ববর্তী একটি [যা ক্যাপচারিত নয় (চেহারাতে পিছনে));
  • একটি লোভী বন্দী দল। প্রথমে থামানো অ-লোভী]; এবং
  • এর পরে a] যা ধরা পড়ে না (lookahead)।

বিকল্পভাবে আপনি কেবল বর্গাকার বন্ধনীগুলির মধ্যে যা ক্যাপচার করতে পারেন:

\[(.*?)\]

এবং পুরো ম্যাচের পরিবর্তে প্রথম দখলকৃত গ্রুপটি ফিরিয়ে দিন।


137
"সহজ কাজ", LOL! :) নিয়মিত প্রকাশগুলি সর্বদা আমাকে মাথা ব্যাথা দেয়, আমার সমস্যাগুলি সমাধান করার সাথে সাথে আমি সেগুলি ভুলে যেতে চাই। আপনার সমাধানগুলি সম্পর্কে: প্রথমটি প্রত্যাশার মতো কাজ করে, দ্বিতীয়টি তা করে না, এটি বন্ধনীগুলি সহ রাখে। আমি সি # ব্যবহার করছি, সম্ভবত রেজিএক্স অবজেক্টটির রেগেক্স ইঞ্জিনটির নিজস্ব "গন্ধ" রয়েছে ...
ডিয়েগো

4
এটি এটি করছে কারণ আপনি প্রথম ম্যাচের গ্রুপের চেয়ে পুরো ম্যাচটি দেখছেন।
ক্লিটাস

অনেক ধন্যবাদ, খুব দরকারী ওয়েবসাইট! আমি এটি একটি রেফারেন্স হিসাবে রাখব। :) দুঃখিত যদি আমি কিছু বিভ্রান্তি তৈরি করি, সি # বিকাশ আসলে আমার দক্ষতার মধ্যে একটি নয় ..
ডিয়েগো

1
যদি স্ট্রাস্টিংয়েও সীমানা থাকে তবে এটি কাজ করে? উদাহরণস্বরূপ This is a test string [more [or] less]এই ফিরে আসবে more [or] less?
gnzlbg

1
@gnzlbg না, এটি "আরও [বা" ফিরে আসবে
মেরিকোওয়া

52

আপনি যদি জাভাস্ক্রিপ্ট ব্যবহার করছেন , ক্লিটাস দ্বারা সরবরাহিত প্রথম সমাধান(?<=\[)(.*?)(?=\]) , কাজ করবে না কারণ জাভাস্ক্রিপ্ট লুকবাইন্ড অপারেটরটিকে সমর্থন করে না।

যাইহোক, দ্বিতীয় সমাধানটি ভালভাবে কাজ করে তবে আপনার দ্বিতীয় মিলিত উপাদান পাওয়া দরকার।

উদাহরণ:

var regex = /\[(.*?)\]/;
var strToMatch = "This is a test string [more or less]";
var matched = regex.exec(strToMatch);

এটি ফিরে আসবে:

["[more or less]", "more or less"]

সুতরাং, আপনার যা প্রয়োজন তা হল দ্বিতীয় মান value ব্যবহার করুন:

var matched = regex.exec(strToMatch)[1];

ফিরে:

"more or less"

2
স্ট্রিংয়ে [আরও বা কম] একাধিক ম্যাচ হলে কী হবে?

ES2018
TheDarkIn1978

19

আপনার বন্ধনীগুলির মধ্যে বিটটি কেবল 'ক্যাপচার' করতে হবে।

\[(.*?)\]

ক্যাপচার করতে আপনি এটিকে প্রথম বন্ধনীতে রেখেছেন। আপনি কোনটি ভাষা ব্যবহার করছেন তা বলবেন না। উদাহরণস্বরূপ পার্লে, আপনি এটি $ 1 ভেরিয়েবল ব্যবহার করে অ্যাক্সেস করতে পারবেন।

my $string ='This is the match [more or less]';
$string =~ /\[(.*?)\]/;
print "match:$1\n";

অন্যান্য ভাষায় বিভিন্ন পদ্ধতি থাকবে। সি #, উদাহরণস্বরূপ, মিল সংগ্রহের ক্লাস ব্যবহার করে , আমি বিশ্বাস করি।


ধন্যবাদ, তবে এই সমাধানটি কার্যকর হয়নি, এটি বর্গাকার বন্ধনী সহ বজায় রাখে। আমি ক্লেটাসের সমাধানটিতে আমার মন্তব্যে যেমন লিখেছি, এমন হতে পারে যে সি # রেজেক্সেক্স অবজেক্টটি এটির অন্যভাবে ব্যাখ্যা করে। যদিও আমি সি # তে বিশেষজ্ঞ নই, সুতরাং এটি কেবল অনুমান, সম্ভবত এটি আমার জ্ঞানের অভাব মাত্র। :)
ডিয়েগো

11

[^\[] যে অক্ষরটি নয় [তার সাথে মেলে।

+1 বা আরও বেশি কিছু যা মিলবে না তার সাথে মিল দিন [। এই ম্যাচের গ্রুপ তৈরি করে।

(?=\])ইতিবাচক চেহারা ]। কোনও গ্রুপকে ]ফলাফলের সাথে অন্তর্ভুক্ত না করে সমাপ্তির সাথে মেলে ।

সম্পন্ন.

[^\[]+(?=\])

প্রুফ।

http://regexr.com/3gobr

নাল দ্বারা প্রস্তাবিত সমাধানের মতো। তবে অতিরিক্তের \]প্রয়োজন হয় না। অতিরিক্ত নোট হিসাবে এটি প্রদর্শিত \হয় যে [পরে এর পরে পালাতে হবে না^ । পঠনযোগ্যতার জন্য, আমি এটি রেখে দেব।

ডিলিমিটররা একইরকম পরিস্থিতিতে কাজ করে না। "more or less"উদাহরণ স্বরূপ.


ভালবাসা!!!!! সবাই কিন্তু আপনি ভুল। ধন্যবাদ কুঁড়ি!
lopezdp

8

পিএইচপি:

$string ='This is the match [more or less]';
preg_match('#\[(.*)\]#', $string, $match);
var_dump($match[1]);


3

ব্যাশ স্ক্রিপ্টিংয়ের সাথে রেজেক্স ব্যবহার করার ক্ষেত্রে আমার একই সমস্যা ছিল। গ্রিপ-প্রয়োগ করে পাইপ ব্যবহার করে আমি একটি 2-পদক্ষেপ সমাধান ব্যবহার করেছি

 '\[(.*?)\]'  

আমি আজ খুশি

'\b.*\b'

স্পষ্টতই অন্যান্য উত্তরগুলিতে দক্ষ নয়, তবে একটি বিকল্প।


3

এটি বিশেষত জাভাস্ক্রিপ্টের নিয়মিত এক্সপ্রেশন পার্সারের জন্য কাজ করে /[^[\]]+(?=])/g

শুধু কনসোল এ এটি চালান

var regex = /[^[\]]+(?=])/g;
var str = "This is a test string [more or less]";
var match = regex.exec(str);
match;

2

আমি / এবং # এর মধ্যে একটি স্ট্রিং খুঁজতে চেয়েছিলাম, তবে # কখনও কখনও alচ্ছিক। আমি ব্যবহার করি এমন রেজেক্স এখানে রয়েছে:

  (?<=\/)([^#]+)(?=#*)

তুমি আমাকে সারা দিন বাঁচিয়েছ! ধন্যবাদ!
rans

0

সি # তে '[' এবং ']' ছাড়া আমি কীভাবে পেলাম এখানে:

        var text = "This is a test string [more or less]";
        //Getting only string between '[' and ']'
        Regex regex = new Regex(@"\[(.+?)\]");
        var matchGroups = regex.Matches(text);
        for (int i = 0; i < matchGroups.Count; i++)
        {
            Console.WriteLine(matchGroups[i].Groups[1]);
        }

আউটপুটটি হ'ল:

more or less

-1

আপনার যদি বন্ধনী ব্যতীত পাঠ্য নিষ্কাশনের প্রয়োজন হয়, আপনি ব্যাশ কর্ক ব্যবহার করতে পারেন

echo " [hola mundo] " | awk -F'[][]' '{print $2}'

ফলাফল:

hola mundo

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.