পার্থক্য কি ?:, ?! এবং? = রেইগেক্সে?


118

আমি এই এক্সপ্রেশনগুলির অর্থ অনুসন্ধান করেছিলাম তবে তাদের মধ্যে সঠিক পার্থক্যটি বুঝতে পারি নি। এগুলি তারা বলে:

  • ?: মিলটি প্রকাশ করুন তবে এটি ক্যাপচার করবেন না।
  • ?= একটি প্রত্যয় মেলে তবে ক্যাপচার থেকে বাদ দিন।
  • ?! প্রত্যয়টি অনুপস্থিত থাকলে মিল করুন।

আমি এগুলিকে সাধারণ রেজিএক্সে ব্যবহার করার চেষ্টা করেছি এবং সবার জন্য একই রকম ফলাফল পেয়েছি। উদাহরণস্বরূপ: নিম্নলিখিত 3 টি এক্সপ্রেশন খুব অনুরূপ ফলাফল দেয়।

  • [a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?!\.[a-zA-Z0-9]+)*
  • [a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?=\.[a-zA-Z0-9]+)*
  • [a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9]+)*

দয়া করে আপনার পরীক্ষার কেসটি আমাদের দেখান। তাদের একই ফলাফল দেওয়া উচিত নয়।
বার্গি

@ sepp2k, কয়েকটি ক্ষেত্রে একইরকম ফলাফল, প্রশ্নগুলির মধ্যে একটি উল্লেখ করেছেন।
আর কে পোদ্দার

@ বেরগি, আমি এটিকে ইংরাজী শব্দ, ফোন নম্বর, ইউআরএল, ই-মেইল ঠিকানা, নম্বর ইত্যাদির সাথে এলোমেলো ডেটা দিয়ে পরীক্ষা করেছি।
আর কে পোদ্দার

4
@ আর কে আগরওয়াল আহ, আমি দেখছি আপনি সেখানে কী করেছেন। আপনি *গোষ্ঠীগুলির পরে কিছু যোগ করেছেন , তাই এগুলি কেবল উপেক্ষা করা হবে।
sepp2k

নুবি নোট : আপনি কেবল এগুলি প্রথম বন্ধনী শুরুর সময়ই ব্যবহার করবেন এবং বন্ধনী একটি ক্যাপচারিং গ্রুপ গঠন করে (বিভিন্ন বন্ধনী সেটগুলি পাঠ্যের বিভিন্ন বিভাগ বের করে)।
রায়ান টেলর

উত্তর:


170

?=এবং এর মধ্যে পার্থক্যটি ?!হ'ল প্রাক্তনটির সাথে মিলিত হওয়ার জন্য প্রদত্ত অভিব্যক্তিটি প্রয়োজন হয় এবং পরবর্তীটির সাথে এটি মেলে না requires উদাহরণস্বরূপ a(?=b)"আব" এ "এ" মিলবে, তবে "এসি" তে "এ" নয়। যেখানে a(?!b)"এসি" তে "এ" মিলবে তবে "আব" তে "এ" নয়।

?:এবং এর মধ্যে পার্থক্যটি ?=হ'ল ?=পুরো ম্যাচ থেকে ভাবটি বাদ দেয় যখন ?:কেবল ক্যাপচারিং গ্রুপ তৈরি করে না। সুতরাং উদাহরণস্বরূপ a(?:b)"abc" "ab" এর সাথে a(?=b)মিলবে , যখন কেবল "abc" তে "a" টি মিলবে। a(b)"abc" এর "ab" এর সাথে মিলবে এবং "b" সমন্বিত একটি ক্যাপচার তৈরি করবে।


87
?:  is for non capturing group
?=  is for positive look ahead
?!  is for negative look ahead
?<= is for positive look behind
?<! is for negative look behind

খুব ভাল টিউটোরিয়াল এবং নিয়মিত অভিব্যক্তিগুলিতে বর্ণনীর উপর উদাহরণের জন্য দয়া করে এখানে দেখুন: http://www.regular-expressions.info/lookaround.html


15
তবু জাভাস্ক্রিপ্ট লুকবাইন্ড জানে না।
বার্গি

4
এই সাধারণ জেনারেলগুলির জন্য আরও সম্পূর্ণ।
ইয়ান ইয়াং

/ (? <= ^ এ) খ / জাভাস্ক্রিপ্টে আমার জন্য কাজ করেছে! ইন্টারনেটে জাভাস্ক্রিপ্ট পিছনে দেখার জন্য কোনও টিউটোরিয়াল নেই বলে মনে হয়।
Y. Yoshii

শুধুমাত্র ব্রাউজারগুলির সাম্প্রতিক সংস্করণগুলি জেএস
অনুভা

- অনুভা আমি / (? <= ^ A) বি / খাঁটি নিয়মিত এক্সপ্রেশন ব্যবহার করার বিকল্প জানি না। সম্ভবত আমি করতে পারি তবে আমাকে কলব্যাক ফাংশনগুলির উপর নির্ভর করতে হবে।
Y. Yoshii

22

আরও ভাল বোঝার জন্য আসুন তিনটি এক্সপ্রেশন প্লাস ক্যাপচারিং গ্রুপ প্রয়োগ করুন এবং প্রতিটি আচরণ বিশ্লেষণ করুন।

  • () ক্যাপচারিং গ্রুপ - প্রথম বন্ধনের অভ্যন্তরে থাকা রেজেক্সটি অবশ্যই মিলবে এবং ম্যাচটি একটি ক্যাপচারিং গ্রুপ তৈরি করবে
  • (?:) নন ক্যাপচারিং গ্রুপ - প্রথম বন্ধনের অভ্যন্তরে থাকা রেজেক্স অবশ্যই মেলানো উচিত তবে ক্যাপচারিং গ্রুপ তৈরি করে না
  • (?=) ইতিবাচক চেহারা এগিয়ে - জোর দিয়ে যে পুনর্গঠন করা উচিত
  • (?!) নেতিবাচক চেহারা এগিয়ে - দৃge়রূপে যে regex সাথে মেলে এটি অসম্ভব

আসুন ছাড়ারq(u)i জন্য আবেদন করা যাক । ম্যাচ কুই এবং ক্যাপচারিং গ্রুপ মিলে যায় তোমার দর্শন লগ করা । ক্যাপচারিং গ্রুপের ভিতরে ম্যাচটি নেওয়া হয় এবং একটি ক্যাপচারিং গ্রুপ তৈরি করা হয়। ইঞ্জিন তাই চালিয়ে যায় । এবং মিলবে i । শেষ ম্যাচের এই প্রচেষ্টাটি সফল। Qui মিল দেখা যায় সঙ্গে একটি ক্যাপচার গ্রুপ U তৈরি করা হয়।quii

আসুন ছাড়ারq(?:u)i জন্য আবেদন করা যাক । আবার, সাথে মেলে কুই এবং অ ক্যাপচার গ্রুপ মিলে যায় তোমার দর্শন লগ করা । নন-ক্যাপচারিং গ্রুপ থেকে ম্যাচটি নেওয়া হয় তবে ক্যাপচারিং গ্রুপটি তৈরি হয় না। ইঞ্জিন তাই চালিয়ে যায় । এবং মিলবে i । শেষ ম্যাচের এই প্রচেষ্টাটি সফল। কুই মিলছেquii

আসুন ছাড়ারq(?=u)i জন্য আবেদন করা যাক । চেহারাটি ইতিবাচক এবং এর পরে অন্য একটি টোকেন রয়েছে। আবার, সাথে মেলে কুই এবং ম্যাচ তোমার দর্শন লগ করা । আবার লুকেহেড থেকে ম্যাচটি বাতিল করতে হবে, তাই ইঞ্জিনটি স্ট্রিং থেকে ফিরে আপনার দিকে যাবে । চেহারাটি সফল ছিল, তাই ইঞ্জিনটি চালিয়ে যায় । তবে তোমার সাথে মেলে নাquiii । সুতরাং এই ম্যাচের প্রচেষ্টা ব্যর্থ।

আসুন ছাড়ারq(?=u)u জন্য আবেদন করা যাক । চেহারাটি ইতিবাচক এবং এর পরে অন্য একটি টোকেন রয়েছে। আবার, সাথে মেলে কুই এবং ম্যাচ তোমার দর্শন লগ করা । লুকহ্যাড থেকে ম্যাচটি অবশ্যই বাতিল করতে হবে, তাই ইঞ্জিনটি স্ট্রিং থেকে ফিরে আপনার দিকে যাবে । চেহারাটি সফল ছিল, তাই ইঞ্জিনটি চালিয়ে যায় । আর ম্যাচ হবে তোমার দর্শন লগ করা । সুতরাং এই ম্যাচ প্রচেষ্টা সফল। ququuuu হয়

আসুন ছাড়ারq(?!i)u জন্য আবেদন করা যাক । এমনকি এক্ষেত্রে লুক হেড ইতিবাচক (কারণ এটি মেলে না) এবং এটির পরে অন্য একটি টোকেনও রয়েছে। আবার, কিউয়ের সাথে মেলে এবং তোমার সাথে মেলে না । লুকহ্যাড থেকে ম্যাচটি অবশ্যই বাতিল করতে হবে, তাই ইঞ্জিনটি স্ট্রিং থেকে ফিরে আপনার দিকে যাবে । চেহারাটি সফল ছিল, তাই ইঞ্জিনটি চালিয়ে যায় । আর ম্যাচ হবে তোমার দর্শন লগ করা । সুতরাং এই ম্যাচ প্রচেষ্টা সফল। quiqiuuu হয়

সুতরাং, উপসংহারে, লুকোহেড এবং নন-ক্যাপচারিং গ্রুপগুলির মধ্যে আসল পার্থক্যটি কেবলমাত্র যদি আপনি কেবল অস্তিত্ব বা পরীক্ষা পরীক্ষা করতে চান এবং ম্যাচটি সংরক্ষণ করুন। ক্যাপচারিং গ্রুপটি ব্যয়বহুল তাই এটিকে যথাযথভাবে ব্যবহার করুন।


> তাই ইঞ্জিনটি স্ট্রিংয়ের মধ্যে থেকে ইউ তে ফিরে আসে। চেহারাটি সফল ছিল, তাই ইঞ্জিনটি i দিয়ে চালিয়ে যায়। তবে আমি আপনার সাথে মেলে না এটি সম্পূর্ণ বিভ্রান্তিকর। এই চেহারা যদি পিছনে কেন ?
সবুজ

4
@ গ্রীন লুকে হেড এবং অন্যান্য দর্শনীয় নির্মাণগুলি সম্পর্কে বোঝার জন্য একটি গুরুত্বপূর্ণ বিষয় হ'ল যদিও তারা তাদের গতিপথটি অবিচ্ছিন্নভাবে মেলে কিনা তা দেখার জন্য যদিও তারা কোনও লেখা "গ্রাস" করে না। এটি কিছুটা বিভ্রান্তিকর হতে পারে
ফ্রিডেভ

7

এর foobarবিপরীতে মিলানোর চেষ্টা করুন :

/foo(?=b)(.*)/
/foo(?!b)(.*)/

প্রথম রেজেক্সটি মিলবে এবং "সাব" প্রথম সাবম্যাচ হিসাবে ফিরে আসবে - (?=b) মিলবে এবং 'বি' এর সাথে মেলে তবে এটি গ্রাস করে না, এটি নীচের বন্ধনীগুলির জন্য রেখে।

দ্বিতীয় রেজেক্সটি মিলবে না, কারণ এটি "foo" 'বি' থেকে আলাদা কিছু অনুসরণ করবে বলে আশা করে।

(?:...)(...)সাধারণের মতো ঠিক একই প্রভাব রয়েছে তবে এটি সেই অংশটিকে সাবম্যাচ হিসাবে ফিরিয়ে দেয় না।


0

দৃ understand়তাগুলি বোঝার সহজ উপায় হ'ল নিয়মিত অভিব্যক্তিতে commandোকানো কমান্ড হিসাবে তাদের আচরণ করা। ইঞ্জিনটি যখন কোনও দৃser়তার দিকে চলে যায়, তখন তা তাত্ক্ষণিকভাবে দাবি দ্বারা বর্ণিত শর্তটি পরীক্ষা করবে। ফলাফলটি যদি সত্য হয় তবে নিয়মিত এক্সপ্রেশন চালিয়ে যান।


0

এটিই আসল পার্থক্য:

>>> re.match('a(?=b)bc', 'abc')
<Match...>
>>> re.match('a(?:b)c', 'abc')
<Match...>

# note:
>>> re.match('a(?=b)c', 'abc')
None

আপনি যদি "?:" বা "? =", "?:" এবং "? =" এর পরে বিষয়বস্তু যত্ন না করেন তবে ঠিক একই রকম। উভয়ই ব্যবহার করা ঠিক আছে।

তবে যদি আপনার আরও প্রক্রিয়াটির জন্য এই সামগ্রীগুলির প্রয়োজন হয় (কেবল পুরো জিনিসটির সাথে মেলে না that সেক্ষেত্রে আপনি কেবল "ক (খ)" ব্যবহার করতে পারেন) পরিবর্তে আপনাকে "? =" ব্যবহার করতে হবে। কারণ "?:" কেবল এটির মধ্য দিয়েই চলে যাবে।

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