কোনও ক্রমে দুটি নাম যুক্ত স্ট্রিংয়ের সাথে মিল রেখে রেজেজ


180

আমার রেজেক্সে লজিকাল এবং দরকার।

কিছুটা এইরকম

জ্যাক এবং জেমস

নিম্নলিখিত স্ট্রিংগুলির সাথে একমত

  • 'হাই জ্যাক এখানে জেমস '

  • 'হাই জেমস এখানে জ্যাক '



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

উত্তর:


261

আপনি চেহারাগুলি ব্যবহার করে চেক করতে পারেন :

^(?=.*\bjack\b)(?=.*\bjames\b).*$

এটা পরীক্ষা করো.

এই পদ্ধতির সুবিধা রয়েছে যা আপনি সহজেই একাধিক শর্ত নির্দিষ্ট করতে পারেন।

^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$

18
এই উদাহরণটি কীভাবে কাজ করে কেউ কি আরও কিছুটা বিশদে ব্যাখ্যা করতে মন চাইবেন?
বিজেএমসি

2
vimবাক্য গঠন: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$বা\v^(.*<jack>)@=(.*<james>)@=.*$
মাইখাল

আমি কি '#' দিয়ে শুরু করে স্ট্রিংগুলি অনুসন্ধান করার চেষ্টা করব তখন কেন (জাভাস্ক্রিপ্টে কমপক্ষে) এটি ভেঙে যাবে তা কি কেউ জানেন? ^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$মেলে ব্যর্থ হয় blah #tgif blah #friday blahকিন্তু ^(?=.*\bfriday\b)(?=.*\btgif\b).*$কাজ করে।
বুলেটফ্লার

2
\bএখানে মানে কি ?
বরুণআগউ


106

চেষ্টা করুন:

james.*jack

যদি আপনি উভয় একই সময়ে চান, তবে orসেগুলি:

james.*jack|jack.*james

1
গৃহীত উত্তর কাজ করে। এটি আমার জন্য নিখুঁতভাবে কাজ করেছে। ভিজ্যুয়াল স্টুডিওতে কোড অনুসন্ধানের জন্য 'ফলাফলগুলি অনুসন্ধান করুন'।
দই দ্য ওয়াইজ

1
এটি আমার পক্ষে কাজ করে এবং স্বীকৃত উত্তরের চেয়ে আরও সংক্ষিপ্ত এবং বোঝা সহজ!
কুমার মনীষ

1
আমার এমন একটি সমাধানের প্রয়োজন ছিল যার সাথে দুটি মিলের জন্য কেবল দুটি নাম ছিল, সুতরাং এই উত্তরটি সেই ক্ষেত্রে আরও সংক্ষিপ্ত। তবে গ্রহণযোগ্য উত্তর 2 ছাড়িয়ে আরও সংক্ষিপ্ত হয়ে যায় যেহেতু "বা" এর সংখ্যা ঘটনাগতভাবে বৃদ্ধি পায়। 3 নামের জন্য 6 "বা" গুলি, 4 টি নাম 24 "বা" গুলি "ইত্যাদি হবে
উইলকাউ

আমি এটি অলস করতে সুপারিশ করব james.*?jack|jack.*?james । এটি বৃহত পাঠগুলিতে সহায়তা করবে।
জেকিস

42

যে কমান্ডটি আমি লিখতে চলেছি তার ব্যাখ্যা : -

. মানে যে কোনও অক্ষর, ডিজিটের জায়গায় আসতে পারে।

* এর অর্থ শূন্য বা তার বেশি আগের জিনিসটির উপস্থিতি।

|অর্থ 'বা'

সুতরাং,

james.*jack

অনুসন্ধান করবে james , তারপরে যতক্ষণ না চরিত্রের সংখ্যা jackআসবে।

যেহেতু আপনি চান jack.*jamesবা হয়james.*jack

অতএব আদেশ :

jack.*james|james.*jack

7
পার্শ্ব নোট হিসাবে - আপনি @ আইস্রোকের উত্তরও সম্পাদনা করতে পারতেন (যা আপনার মতো, ঠিক 6 বছর আগে), আপনার ব্যাখ্যাটি নিজেই খুব কার্যকর।
ওউজে

2
এই উত্তরের জন্য আপনাকে ধন্যবাদ, আমি তবে এটি উল্লেখ করার প্রয়োজন বোধ করছি যে ভিএসকোড অনুসন্ধানে আপনার উত্তর জ্যাক * * জেমস | জেমস। * জ্যাক '|' এর মধ্যে ফাঁকা স্থান নেবে (বা) সন্ধানের সময় বিবেচনা করা প্রতীক। জ্যাক। * জেমস | জেমস। * জ্যাক কাজ করে এবং স্পেসগুলির সন্ধান করে না
jgritten

2
যদি $ _ বিবরণ === "দুর্দান্ত" তখন ফিরে আসুন $ থাম্বস_আপ সমাপ্তি;
সৈয়দ আকিয়েল



2

ভিমের একটি শাখা অপারেটর রয়েছে \&যা কোনও ক্রমে শব্দের একটি সেট সমেত একটি লাইন অনুসন্ধান করার সময় দরকারী। তদতিরিক্ত, প্রয়োজনীয় শব্দের সংকলন প্রসারিত করা তুচ্ছ।

উদাহরণ স্বরূপ,

/.*jack\&.*james

একটি লাইন যুক্ত লাইন jackএবং jamesকোনও ক্রমে মিলবে ।

ব্যবহার সম্পর্কে আরও তথ্যের জন্য এই উত্তরটি দেখুন । আমি ব্র্যাঙ্কিং প্রয়োগ করে এমন কোনও রেইগেক্স গন্ধ সম্পর্কে অবগত নই; অপারেটর এমনকি নিয়মিত এক্সপ্রেশন উইকিপিডিয়া প্রবেশে নথিভুক্ত করা হয় না ।


2

পদ্ধতি 1: এক jackএবং একjames

যদি এমন কিছু ঘটে, দুই jackবা দুই jamesএকমাত্র না অনুমতি দেওয়া হবে jackএবং এক jamesবৈধ হতে হবে, আমরা সম্ভবত অনুরূপ একটি অভিব্যক্তি ডিজাইন করতে পারেন:

^(?!.*\bjack\b.*\bjack\b)(?!.*\bjames\b.*\bjames\b)(?=.*\bjames\b)(?=.*\bjack\b).*$

এখানে, আমরা এই বিবৃতিগুলি ব্যবহার করে সেই জুড়ি উদাহরণগুলি বাদ দিই:

(?!.*\bjack\b.*\bjack\b)

এবং,

(?!.*\bjames\b.*\bjames\b)

RegEx ডেমো 1

আমরা এটিকে সহজও করতে পারি,

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$

RegEx ডেমো 2


আপনি যদি ভাবটি সরল / সংশোধন / অন্বেষণ করতে চান তবে এটি regex101.com এর ডানদিকে ডান প্যানেলে ব্যাখ্যা করা হয়েছে । আপনি যদি চান, আপনি এই লিঙ্কটিতেও দেখতে পারেন , কীভাবে এটি কিছু নমুনার ইনপুটগুলির সাথে মেলে।


রেজেক্স সার্কিট

jex.im নিয়মিত এক্সপ্রেশন ভিজ্যুয়ালাইজ করে:

এখানে চিত্র বর্ণনা লিখুন

পরীক্ষা

const regex = /^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$/gm;
const str = `hi jack here is james
hi james here is jack
hi james jack here is jack james
hi jack james here is james jack
hi jack jack here is jack james
hi james james here is james jack
hi jack jack jack here is james
`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}


পদ্ধতি 2: নির্দিষ্ট ক্রমে এক jackএবং একjames

এছাড়া প্রথম ডিজাইন করা যায় jamesগত jack, নিম্নলিখিত এক অনুরূপ:

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b.*\bjack\b).*$

RegEx ডেমো 3

এবং বিপরীতভাবে:

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$

RegEx ডেমো 4


0

আপনি রেজেক্সের কোয়ান্টিফায়ার বৈশিষ্ট্যটি ব্যবহার করতে পারেন যেহেতু lookaroundসর্বদা সমর্থিত না হতে পারে।

(\b(james|jack)\b.*){2,}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.