কীভাবে মিলবে, কিন্তু ক্যাপচার নয়, একটি রেইজেক্সের অংশ?


209

আমার কাছে স্ট্রিংয়ের একটি তালিকা রয়েছে। তাদের কিছু ফর্ম হয় 123-...456। পরিবর্তনশীল অংশ "..." হতে পারে:

  • একটি হাইফেনের পরে স্ট্রিং "আপেল", যেমন 123-apple-456
  • স্ট্রিং "কলা" এর পরে হাইফেন থাকে, যেমন 123-banana-456
  • একটি ফাঁকা স্ট্রিং, যেমন 123-456(মনে রাখবেন কেবলমাত্র একটি হাইফেন রয়েছে)

"আপেল" বা "কলা" ব্যতীত অন্য কোনও শব্দই অবৈধ।

এই তিনটি ক্ষেত্রে, আমি যথাক্রমে "আপেল", "কলা" এবং "" মেলাতে চাই। মনে রাখবেন যে আমি হাইফেনটি ক্যাপচার করতে চাই না , তবে আমি সর্বদা এটির সাথে মিল রাখতে চাই। 123-...456উপরে বর্ণিত স্ট্রিং যদি ফর্মের না হয় তবে কোনও মিল নেই।

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


এখানে মূল পর্যবেক্ষণটি হ'ল আপনার যখন "আপেল" বা "কলা" থাকে তখন আপনার অবশ্যই অবশ্যই পিছনের হাইফেন থাকা উচিত তবে আপনি এটির সাথে মেলে না। এবং যখন আপনি ফাঁকা স্ট্রিংয়ের সাথে মিল করছেন, আপনার অবশ্যই পিছনের হাইফেন থাকা উচিত নয় । আমার মনে হয় যে একটি দৃge় অবস্থানটি যথোপযুক্ত করে তোলে the


আপনি হাইফেন বাদে সব কিছুর সাথে মিল রাখতে চান?
BrunoLM

উত্তর:


285

কোনও কিছুর ক্যাপচার না করার একমাত্র উপায় হ'ল লুক-এর আশ্বাসগুলি ব্যবহার করা :

(?<=123-)((apple|banana)(?=-456)|(?=456))

কারণ এমনকি নন-ক্যাপচারিং গ্রুপগুলির(?:…) সাথে পুরো নিয়মিত প্রকাশটি তাদের মিলিত সামগ্রীগুলি ক্যাপচার করে। তবে এই নিয়মিত অভিব্যক্তিটি কেবল তার সাথে মিলে যায় appleবা bananaএর আগে 123-এবং পরে থাকে -456, বা এটি খালি স্ট্রিংয়ের সাথে মেলে যদি এটির আগে 123-এবং অনুসরণ করা হয় 456

|Lookaround  |    Name      |        What it Does                       |
-----------------------------------------------------------------------
|(?=foo)     |   Lookahead  | Asserts that what immediately FOLLOWS the |
|            |              |  current position in the string is foo    |
-------------------------------------------------------------------------
|(?<=foo)    |   Lookbehind | Asserts that what immediately PRECEDES the|
|            |              |  current position in the string is foo    |
-------------------------------------------------------------------------
|(?!foo)     |   Negative   | Asserts that what immediately FOLLOWS the |
|            |   Lookahead  |  current position in the string is NOT foo|
-------------------------------------------------------------------------
|(?<!foo)    |   Negative   | Asserts that what immediately PRECEDES the|
|            |   Lookbehind |  current position in the string is NOT foo|
-------------------------------------------------------------------------

1
+1 - এই ক্ষেত্রে, আপনি গ্রুপ 0 এর পরিবর্তে 1 টি গ্রুপ ব্যবহার করে এটিকে ঘিরে কাজ করতে পারেন তবে এটি একটি দুর্দান্ত (এবং সূক্ষ্ম!) পার্থক্য।
বেন ফাঁকা

@ বেন ব্ল্যাঙ্ক: এটি "ম্যাচ" এবং "ক্যাপচার" কীভাবে ব্যাখ্যা করা যায় তার উপর নির্ভর করে।
গম্বো

8
জাভাস্ক্রিপ্ট সমর্থিত নয়, Yay ! একটি জাতীয় বন্ধুত্বপূর্ণ পদ্ধতি আছে চমৎকার, কিন্তু সব সময়ে খারাপ না হবে, +0.5 (আপ rounding; ডি)
GiantCowFilms

প্রেমের চারিদিকে দৃser়তা! এগুলি রুবির সাথে দুর্দান্ত কাজ করে।
রটস

নিখুঁত সমাধান, আমি এটি পছন্দ করি
ট্রান কোয়াং হাইপ

15

আপডেট: জার্মানি রদ্রিগেজ হেরেরাকে ধন্যবাদ!

জাভাস্ক্রিপ্ট চেষ্টা করুন: /123-(apple(?=-)|banana(?=-)|(?!-))-?456/

মনে রাখবেন ফলাফলটি গ্রুপ 1 এ রয়েছে

ডিবাগেক্স ডেমো


8

চেষ্টা করুন:

123-(?:(apple|banana|)-|)456

এটি মিলবে apple, bananaবা একটি ফাঁকা স্ট্রিং, এবং এর অনুসরণ করে 0 বা 1 হাইফেন থাকবে। ক্যাপচারিং গ্রুপের প্রয়োজন না থাকার বিষয়ে আমি ভুল ছিলাম। বোকা আমাকে।


এটি সঠিক নয় কারণ এটি মেলে, উদাহরণস্বরূপ, "123-নারকেল -456"।
ডেভিড স্টোন

ভেবেছি আপনি আরও সাধারণ চেয়েছিলেন ... স্থির।
থমাস

5

আমি উত্তরগুলির মধ্যে একটিকে (@ op1ekun দ্বারা) পরিবর্তন করেছি:

123-(apple(?=-)|banana(?=-)|(?!-))-?456

কারণটি হ'ল @ op1ekun এর উত্তরও মেলে "123-apple456", আপেলের পরে হাইফেন ছাড়াই।


3

এটা চেষ্টা কর:

/\d{3}-(?:(apple|banana)-)?\d{3}/

1
এটি সঠিক নয় কারণ এটি মেলে, উদাহরণস্বরূপ, "123-নারকেল -456"।
ডেভিড স্টোন

@ ডেভিড: আপনার "কলা" উদাহরণ থেকে এটি কীভাবে আলাদা?
সাইলেন্টগোস্ট

@SilentGhost: আমি শুধুমাত্র ক্যাপচার করতে চান appleবা bananaবা ""। অন্য সমস্ত মানগুলি অবৈধ, যেমনটি আমি বলেছি।
ডেভিড স্টোন

স্রাই, সে ক্ষেত্রে: / \ d {3} - (? :( আপেল | কলা) -)? \ d {3} /
slosd

1
এই উদাহরণটি যা দেখায় তা হ'ল লুকহ্যাড এবং লুকবাইন্ড ব্যবহার না করে একটি নন-ক্যাপচারিং গ্রুপ থাকা সম্ভব।
ভিন্স পানুসিও

0

@ গম্বোর দ্বারা প্রকাশিত অভিব্যক্তিটির একটি ভিন্নতা যা \Kম্যাচে নম্বর ব্লকের অন্তর্ভুক্তি রোধ করতে ম্যাচের অবস্থানগুলি পুনরায় সেট করার জন্য ব্যবহার করে। পিসিআরই রেজেক্স স্বাদে ব্যবহারযোগ্য।

123-\K(?:(?:apple|banana)(?=-456)|456\K)

মিলগুলি:

Match 1  apple
Match 2  banana
Match 3

-3

এখন পর্যন্ত সবচেয়ে সহজ (অজগরটির জন্য কাজ করে) '123-(apple|banana)-?456'


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