নির্দিষ্ট স্ট্রিং ব্যতীত সমস্ত কিছু মেলে


118

আমি জানি যে নীচের রেজেক্সগুলি "লাল", "সবুজ" বা "নীল" সাথে মিলবে।

red|green|blue

বেশ কয়েকটি নির্দিষ্ট স্ট্রিং বাদে কি একে একে সব কিছুর সাথে মিলে যাওয়ার সহজ সরল উপায় আছে ?


1
নিয়মিত প্রকাশের সমস্ত স্বাদ এটি করতে পারে না। আপনি কোন পরিবেশে কাজ করছেন? জাভা? পার্ল? .NET? কিছু সি / সি ++ রিজেক্স লাইব্রেরি? একটি আরডিবিএমএস?
হতাশ

8
আপনি এটি কী চান তা বলবেন না, তবে আপনি কেবল "ম্যাচ" অপারেশনটির ধারণাটি পরিবর্তন করতে পারেন। আপনি যদি মিলে না যাওয়া অংশগুলিতে নিষ্কাশন করার চেষ্টা করছেন তবে এটি আপনাকে সহায়তা করবে না, তবে কোনও বাদ পড়া স্ট্রিং উপস্থিত না রয়েছে কিনা তা পরীক্ষা করতে এটি কার্যকর হবে: if (!s.match(/red|green|blue/)) ... দ্রষ্টব্য: আমি জানি যে ওপি কোন ভাষা / কাঠামো নির্দিষ্ট করে না, তাই পূর্ববর্তীটি একটি জেনারিক উদাহরণ হিসাবে বিবেচনা করা উচিত, একটি নির্দেশমূলক উদাহরণ নয়।
tvanfosson

উত্তর:


153

আপনি যদি নিশ্চিত করতে চান যে স্ট্রিংটি লাল, সবুজ বা নীল নয় তবে ক্যাসির উত্তর এটি। তবে প্রায়শই যা যা চাওয়া হয় তা হ'ল লাইনটি কোথাও কোথাও লাল, সবুজ বা নীল রঙের না থাকে তা নিশ্চিত করা। তার জন্য, নিয়মিত অভিব্যক্তিটি অ্যাঙ্কর করুন ^এবং .*নেতিবাচক চেহারাতে অন্তর্ভুক্ত করুন :

^(?!.*(red|green|blue))

এছাড়াও, মনে করুন যে আপনি "ইঞ্জিন" শব্দটি সম্বলিত লাইনগুলি চান তবে সেগুলির কোনও রঙ ছাড়াই:

^(?!.*(red|green|blue)).*engine

আপনি ভাবতে পারেন যে আপনি .*নিয়মিত অভিব্যক্তির মাথাটিকে ফ্যাক্ট করতে পারেন :

^.*(?!red|green|blue)engine     # Does not work

কিন্তু তুমি করতে পারো না. .*এটি কাজ করার জন্য আপনার উভয় দৃষ্টান্ত থাকতে হবে।


48

ভাষার উপর নির্ভর করে তবে সাধারণত নেতিবাচক-জোর দেওয়া থাকে যা আপনি পছন্দ করতে পারেন:

(?!red|green|blue)

(সিনট্যাক্স ঠিক করার জন্য ধন্যবাদ, উপরেরটি বৈধ জাভা এবং পার্ল, ওয়াইএমএমভি)


2
@ ক্যাসকি, পুরো উত্তরটি আমার এবং আপনার একটি সংমিশ্রণ। আপনি যদি তাদের একত্রিত করতে চান তবে আমি আমার মুছে ফেলব।
ওয়েইন কনরাড

13
এই উত্তরটি অনেক বেশি কার্যকর হবে আপনি কি এটি একটু ব্যাখ্যা করেছেন। উদাহরণস্বরূপ: "কি?" এবং "!" এর অর্থ কি? আপনার কেন ক্যাপচার গ্রুপ দরকার?
Lii

এটিও বৈধ পাইথন।
জো মর্নিন

এটি কেবল ডেলফি রেজিএক্স লাইব্রেরিতে ব্যবহার করেছে এবং এটি কেবল এইরকমভাবে কাজ করে: ^ (?! লাল | সবুজ | নীল)। Regex101.com এ এটি পরীক্ষার জন্যও সত্য । তাহলে কি উপরের টাইপগুলিতে একটি missing অনুপস্থিত বা এটি আসলে জাভা / পার্ল / পাইথনের মতো কাজ করে ..?
পিটার

32

ম্যাচিং অ্যাথিং উইথ বিট গার্ড স্ট্রিংস

আপনি যদি পুরো স্ট্রিংয়ের সাথে মিল রাখতে চান যেখানে আপনি কিছু নির্দিষ্ট স্ট্রিংয়ের সাথে মিল রাখতে চান তবে আপনি এটি এইভাবে করতে পারেন:

^(?!(red|green|blue)$).*$

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

আপনি এটি এখানে চেষ্টা করতে পারেন: https://regex101.com/r/rMbYHz/2

নোট করুন যে এটি কেবলমাত্র রেগেক্স ইঞ্জিনগুলির সাথে কাজ করে যা একটি নেতিবাচক বর্ণনহীনকে সমর্থন করে ।


23

আপনার নেতিবাচক চেহারা দরকার নেই। কাজের উদাহরণ রয়েছে:

/([\s\S]*?)(red|green|blue|)/g

বর্ণনা:

  • [\s\S] - যে কোনও চরিত্রের সাথে মেলে
  • * - 0 থেকে পূর্ববর্তী গ্রুপ থেকে সীমাহীন থেকে ম্যাচ
  • ? - যতটা সম্ভব কম ম্যাচ করুন
  • (red|green|blue|) - এই শব্দের একটি বা কিছুই মিলছে না
  • g - পুনরাবৃত্তি প্যাটার্ন

উদাহরণ:

whiteredwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhiteredwhite

হবে:

whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite

এটা পরীক্ষা করো: regex101.com


4
আপনি কোনও বিন্দুর জন্য [\ s \ S] অদলবদল করে ধাপ গণনাটিকে হ্রাস করতে পারবেন। আমি খুব বিভ্রান্ত হয়েছি কেন আপাতদৃষ্টিতে প্রতিটি অন্যান্য উদাহরণ প্রতিটি শব্দ পৃথকভাবে ক্যাপচার করে। এই উপায়টি সামান্য আরও রেগেক্স পদক্ষেপ তবে এর চেয়ে কম কম প্রক্রিয়াজাতকরণ প্রয়োজন requires
জ্যাট্রোনিয়াম

3
তবে এটি মিলবে না (পাঠ্যের বৈধতা), এটি প্রতিস্থাপনের সময় নির্দিষ্ট পাঠ্য সরিয়ে দেয়।
মারেক আর

এই সমাধানটি জ্ঞাত শব্দের পরে পাঠ্যের চূড়ান্ত অংশ আউটপুট দেবে না। সুতরাং, গতির তুলনা করার প্রয়োজন নেই, এটি কেবল ভুল।
উইক্টর স্ট্রিবিউ

@ উইক্টরস্ট্রিবিউউ ঠিক করা হয়েছে।
এইচএলসিএস

10

আমার একই প্রশ্ন ছিল, প্রস্তাবিত সমাধানগুলি প্রায় কাজ করে যাচ্ছিল তবে তাদের কিছু সমস্যা ছিল। শেষ পর্যন্ত আমি ব্যবহৃত রেজেক্সটি হ'ল:

^(?!red|green|blue).*

আমি এটি জাভাস্ক্রিপ্ট এবং। নেট এ পরীক্ষা করেছি।

। * এই জাতীয় নেতিবাচক চেহারার ভিতরে স্থাপন করা উচিত নয়: ^ (?! * লাল | সবুজ | নীল) বা এটি প্রথম উপাদানটিকে বাকী থেকে আলাদা আচরণ করবে (যেমন "অন্য আরেকটি" মিলবে না যখন " অন্য গ্রীন "হবে)


3

যে কোনও পাঠ্যের সাথে মিলে গেলেও প্যাটার্নের সাথে মেলে এমনগুলি সাধারণত রেজেক্স প্যাটার্নের সাথে স্ট্রিংকে বিভক্ত করার মাধ্যমে অর্জন করা হয় ।

উদাহরণ :

  • - Regex.Split(text, @"red|green|blue")বা, খালি মানগুলি থেকে মুক্তি পেতে Regex.Split(text, @"red|green|blue").Where(x => !string.IsNullOrEmpty(x))( ডেমো দেখুন )
  • - Regex.Split(text, "red|green|blue")বা, খালি আইটেমগুলি সরিয়ে ফেলতে, Regex.Split(text, "red|green|blue").Where(Function(s) Not String.IsNullOrWhitespace(s))( ডেমো দেখুন বা লিনকুই সমর্থিত এই ডেমোটি দেখুন )
  • - text.split(/red|green|blue/)( gএখানে মডিফায়ার ব্যবহার করার দরকার নেই!) (খালি মানগুলি থেকে মুক্তি পেতে, ব্যবহার করতে text.split(/red|green|blue/).filter(Boolean)), ডেমো দেখুন
  • - text.split("red|green|blue"), - - সমস্ত ফাঁকা আইটেম অনুসরণ করতে - ব্যবহার করুন text.split("red|green|blue", -1)বা সমস্ত খালি আইটেমগুলি অপসারণ করতে আরও কোড ব্যবহার করুন ( ডেমো দেখুন )
  • - জাভা এর মতো, text.split(/red|green|blue/)সমস্ত অনুসরণীয় আইটেম ব্যবহার করতে text.split(/red|green|blue/, -1)এবং সমস্ত খালি আইটেম ব্যবহার সরিয়ে ফেলতে text.split(/red|green|blue/).findAll {it != ""})( ডেমো দেখুন )
  • - text.split(Regex("red|green|blue"))বা, ফাঁকা আইটেমগুলি সরাতে text.split(Regex("red|green|blue")).filter{ !it.isBlank() }, ডেমোটি ব্যবহার করুন
  • - text.split("red|green|blue"), বা সমস্ত ফাঁকা আইটেম অনুসরণ করতে, ব্যবহার text.split("red|green|blue", -1)এবং সমস্ত খালি আইটেম অপসারণ, ব্যবহার text.split("red|green|blue").filter(_.nonEmpty)( ডেমো দেখুন )
  • - text.split(/red|green|blue/), খালি মান ব্যবহার থেকে মুক্তি পাওয়ার জন্য .split(/red|green|blue/).reject(&:empty?)(এবং শীর্ষস্থানীয় এবং খালি আইটেম উভয়ই পেতে -1দ্বিতীয় আর্গুমেন্ট হিসাবে ব্যবহার করুন .split(/red|green|blue/, -1)) ( ডেমো দেখুন )
  • - my @result1 = split /red|green|blue/, $text;, বা সমস্ত ফাঁকা আইটেম সহ my @result2 = split /red|green|blue/, $text, -1;, বা কোনও খালি আইটেম ছাড়াই my @result3 = grep { /\S/ } split /red|green|blue/, $text;( ডেমো দেখুন )
  • - preg_split('~red|green|blue~', $text)বা preg_split('~red|green|blue~', $text, -1, PREG_SPLIT_NO_EMPTY)খালি আইটেম আউটপুট ( ডেমো দেখুন )
  • - re.split(r'red|green|blue', text)বা, খালি আইটেমগুলি সরাতে, list(filter(None, re.split(r'red|green|blue', text)))( ডেমো দেখুন )
  • - ব্যবহার করুন regexp.MustCompile("red|green|blue").Split(text, -1)এবং আপনার খালি আইটেমগুলি সরিয়ে ফেলতে চাইলে এই কোডটি ব্যবহার করুন । গো ডেমো দেখুন ।

দ্রষ্টব্য : যদি আপনার নিদর্শনগুলিতে ক্যাপচারিং গ্রুপ থাকে , তবে অতিরিক্ত বিকল্পগুলির উপর নির্ভর করে রেজেক্স স্প্লিট ফাংশন / পদ্ধতিগুলি আলাদাভাবে আচরণ করতে পারে । অনুগ্রহ করে উপযুক্ত বিভাজন পদ্ধতি ডকুমেন্টেশন দেখুন।


0

"লাল" শব্দ বাদে সব

var href = '(text-1) (red) (text-3) (text-4) (text-5)';

var test = href.replace(/\((\b(?!red\b)[\s\S]*?)\)/g, testF); 

function testF(match, p1, p2, offset, str_full) {
  p1 = "-"+p1+"-";
  return p1;
}

console.log(test);

"লাল" শব্দ বাদে সব

var href = '(text-1) (frede) (text-3) (text-4) (text-5)';

var test = href.replace(/\(([\s\S]*?)\)/g, testF); 

function testF(match, p1, p2, offset, str_full) {
  p1 = p1.replace(/red/g, '');
  p1 = "-"+p1+"-";
  return p1;
}

console.log(test);

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