একটি স্ট্রিংয়ের সাথে ম্যাচ করার জন্য একটি রেজেক্স যা কোনও নির্দিষ্ট অন্যান্য স্ট্রিংয়ের পরে হয় না


115

আমার একটি রেইজেক্স দরকার যা মিলবে blahfooblahতবে মিলবে নাblahfoobarblah

যতক্ষণ তা বার অনুসরণ না করা হয় আমি কেবল foo এবং foo এর চারপাশের সমস্ত কিছুর সাথে মিল রাখতে চাই।

আমি এটি ব্যবহার করার চেষ্টা করেছি: foo.*(?<!bar)যা মোটামুটি কাছাকাছি, তবে এটি মেলে blahfoobarblah। নেতিবাচক চেহারা পিছনে কিছু বার প্রয়োজন না শুধুমাত্র কিছু মেলে প্রয়োজন।

আমি যে নির্দিষ্ট ভাষাটি ব্যবহার করছি তা হ'ল ক্লোজার যা হুডের নীচে জাভা রেজিেক্সস ব্যবহার করে।

সম্পাদনা: আরও সুনির্দিষ্টভাবে বলতে গেলে, আমারও এটি পাস করার দরকার blahfooblahfoobarblahকিন্তু নেই blahfoobarblahblah


1
আপনি foo ব্যবহার করার চেষ্টা করেছেন? * (? <! বার। *)?
থিবল্ট মিথ্যা

উত্তর:


158

চেষ্টা করুন:

/(?!.*bar)(?=.*foo)^(\w+)$/

পরীক্ষা:

blahfooblah            # pass
blahfooblahbarfail     # fail
somethingfoo           # pass
shouldbarfooshouldfail # fail
barfoofail             # fail

নিয়মিত প্রকাশের ব্যাখ্যা

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
    bar                      'bar'
--------------------------------------------------------------------------------
  )                        end of look-ahead
--------------------------------------------------------------------------------
  (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
    foo                      'foo'
--------------------------------------------------------------------------------
  )                        end of look-ahead
--------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    \w+                      word characters (a-z, A-Z, 0-9, _) (1 or
                             more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string

অন্যান্য রেজেক্স

আপনি যদি কেবল barএটির পরে থাকে কেবল তখনই বাদ দিতে চান foo, আপনি ব্যবহার করতে পারেন

/(?!.*foobar)(?=.*foo)^(\w+)$/

সম্পাদন করা

আপনি আপনার প্রশ্নের নির্দিষ্ট করে তুলতে একটি আপডেট করেছেন made

/(?=.*foo(?!bar))^(\w+)$/

নতুন পরীক্ষা

fooshouldbarpass               # pass
butnotfoobarfail               # fail
fooshouldpassevenwithfoobar    # pass
nofuuhere                      # fail

নতুন ব্যাখ্যা

(?=.*foo(?!bar))একটি fooপাওয়া গেছে তা নিশ্চিত করে তবে সরাসরি অনুসরণ করা হয় নাbar


এটি খুব কাছাকাছি, এবং একটি খুব ভাল উত্তর। আমি জানতাম আমি যথেষ্ট নির্দিষ্ট হতে হবে না। :( আমি এই প্রয়োজন: "blahfoomeowwoof / FOOBAR /" লোনলি "foo বিন্যাস", কিন্তু এই blahfoobarmeowwoof না কারণ পাস যদি এই সম্ভব।
Rayne

একটি পার্শ্ব প্রশ্ন হিসাবে, কেউ কীভাবে "বট" নয় তবে "বোটার্স" এর মতো কিছু মিলবে?
রায়নে

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

1
@ রায়েন, এটি একই প্রশ্ন। আপনার উপরের উদাহরণে, আপনি মেলতে চেয়েছিলেন fooতবে মিলেনি foobar। মেলে botতবে মিলবে না botters, আপনি ব্যবহার করবেন /(?=.*bot(?!ters))^(\w+)$/
maček

ঠিক আছে, আমি সাধারণত পুরো শব্দগুলির দিকে লক্ষ্য করছিলাম। আমি যেমন বলেছিলাম, আমি আসলে কী চাই এবং আসলে কী সম্ভব তা নিয়ে আমি বিভ্রান্ত। এভাবে কাজ করলে কাজ হবে। সময় জন্য আপনাকে ধন্যবাদ। :)
রায়নে

55

fooযেটি দিয়ে শুরু হয় না তার সাথে নিম্নলিখিতটি মেলানোর জন্য barচেষ্টা করুন

foo(?!bar)

নেতিবাচক lookbehind এর সাথে আপনার সংস্করণ কার্যকরভাবে হল "মেলে একটি fooএমন কিছু বিষয় যা সমাপ্ত হয় না দ্বারা অনুসরণ bar"। সমস্তটির সাথে .*মেলে barblah, এবং (?<!bar)ফিরে lahতাকাবে এবং এটি মিলছে না তা যাচাই করে bar, যা এটি মেলে না, তাই পুরো প্যাটার্নটি মেলে।


সুতরাং আমি এটি এমন একটি রেইজেক্সের জন্য চেষ্টা করেছি যা "বলি" অনুসরণ না করে "" আপনি কি "স্ট্রিংয়ের সাথে মেশার জন্য নকশাকৃত। উদাহরণস্বরূপ, "আপনি কি বলেছিলেন" এবং "আপনি কি বলেছিলেন" এর মধ্যে পার্থক্য করার সময় এটি কাজ করে, তবে কেবল "আপনি কি করেছেন" নিজেই ক্যাপচার হয় না এবং এটি হওয়া উচিত। কোনও পরামর্শ?
সুসুস

2

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

\s*(?!\w*(bar)\w*)\w*(foo)\w*\s*

এটি আমার পক্ষে কাজ করেছে, আশা করি এটি সাহায্য করবে। শুভকামনা!


সরল তবে কার্যকর রেজেেক্স, যা পুনরাবৃত্ত স্ট্রিংগুলি বাদ দিয়ে কাজ করে ("ফুফু")। পারফেক্ট!
জোনাস বাইস্ট্রোম

1

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

একটি মন্তব্যে এই সমস্তগুলি ম্যাশ করার পরিবর্তে, আমি এটি একটি নতুন উত্তর হিসাবে পোস্ট করছি।

নতুন রেজেক্স

/(?=\w*foo(?!bar))(\w+)/

নমুনা পাঠ

ফোওবিথবার fooevenwithfoobar notfoobar foohere notfoobarhere butfooisokherebar notfoobarhere andnofuu needfoo

ম্যাচ

Fooeithbar Fooevenwithfoobar foohere butfooisokherebar এর দরকার পড়ে


0

আপনার নির্দিষ্ট মিলের অনুরোধটি এর সাথে মিলে যেতে পারে:

\w+foo(?!bar)\w+

এটি মিলবে blahfooblahfoobarblahতবে মিলবে না blahfoobarblahblah

আপনার রেজেক্সের সমস্যাটি foo.*(?<!bar)হ'ল .*পরের foo। এটি অক্ষরের পরে যতগুলি অক্ষরের সাথে মিলিত হয় bar

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