রেজেক্স লুকহ্যাড, লুকহাইন্ড এবং পারমাণবিক গ্রুপ


314

আমি এই জিনিসগুলিকে আমার রেজেেক্স বডিতে পেয়েছি কিন্তু আমি কীসের জন্য সেগুলি ব্যবহার করতে পারি তার কোনও সন্ধান পাইনি। কারও কি উদাহরণ রয়েছে যাতে আমি কীভাবে তারা কাজ করে তা বোঝার চেষ্টা করতে পারি?

(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind

(?>) - atomic group

18
কেন রেজেক্স ওয়েবসাইটের মতো কিছু সাধারণ টেবিল নেই? পরিবর্তে তাদের কাছে কেবল পাঠ্য বর্ণনামূলক ব্লক রয়েছে। নিয়মিত-expressions.info/lookaround.html
হোয়াইটকেট

3
@ হোয়াইটকেট চেষ্টা করুন: regex101.com regexr.com
অ্যান্ড্রু

উত্তর:


850

উদাহরণ

স্ট্রিং দেওয়া foobarbarfoo:

bar(?=bar)     finds the 1st bar ("bar" which has "bar" after it)
bar(?!bar)     finds the 2nd bar ("bar" which does not have "bar" after it)
(?<=foo)bar    finds the 1st bar ("bar" which has "foo" before it)
(?<!foo)bar    finds the 2nd bar ("bar" which does not have "foo" before it)

আপনি তাদের একত্রিত করতে পারেন:

(?<=foo)bar(?=bar)    finds the 1st bar ("bar" with "foo" before it and "bar" after it)

সংজ্ঞা

ইতিবাচক চেহারা (?=)

এক্সপ্রেশন বি অনুসরণ করে যেখানে একটিটি প্রকাশ করুন:

A(?=B)

এগিয়ে নেতিবাচক তাকান (?!)

যেখানে অভিব্যক্তি বি অনুসরণ করে না এমন একটি প্রকাশ করুন:

A(?!B)

ইতিবাচক পিছনে তাকান (?<=)

এক্সপ্রেশন বি এর আগে যেখানে অভিব্যক্তিটি সন্ধান করুন:

(?<=B)A

নেতিবাচক পিছনে তাকান (?<!)

অভিব্যক্তিটি A সন্ধান করুন যেখানে অভিব্যক্তি বি এর আগে হয় না:

(?<!B)A

পারমাণবিক গ্রুপ (?>)

পারমাণবিক গোষ্ঠী একটি গোষ্ঠী থেকে বেরিয়ে আসে এবং গোষ্ঠীর অভ্যন্তরে প্রথম মিলিত প্যাটার্নের পরে বিকল্প নিদর্শনগুলি ছুঁড়ে দেয় (ব্যাকট্র্যাকিং অক্ষম করা হয়)।

  • (?>foo|foot)sপ্রয়োগ করা footsএটি এর প্রথম বিকল্পটির সাথে মিলবে foo, তারপরে sঅবিলম্বে অনুসরণ না করে ব্যর্থ হবে এবং ব্যাকট্র্যাকিং অক্ষম থাকায় বন্ধ করুন

একটি পারমাণবিক গ্রুপ ব্যাকট্র্যাকিংয়ের অনুমতি দেবে; পরবর্তী যদি পরবর্তী মিলগুলি ব্যর্থ হয় তবে পুরো এক্সপ্রেশনটির কোনও মিল খুঁজে পাওয়া না যাওয়া বা সমস্ত সম্ভাবনা শেষ না হওয়া অবধি এটি ব্যাকট্র্যাক করবে এবং বিকল্প নিদর্শনগুলি ব্যবহার করবে।

  • (foo|foot)sউইলে প্রয়োগ হয়েছে foots:

    1. এর 1 ম বিকল্পটি মেলে foo, তারপরে sঅবিলম্বে অনুসরণ না করে যেমন ব্যর্থ হয় footsএবং তার দ্বিতীয় বিকল্পটিতে ব্যাকট্র্যাক হয়;
    2. এর দ্বিতীয় বিকল্পটির সাথে মেলে foot, তারপরে sঅবিলম্বে নিম্নলিখিত হিসাবে সফল হোন footsএবং থামুন।

কিছু সংস্থান

অনলাইন পরীক্ষক


1
"দ্বিতীয় বারটি" অংশটি বলতে কী বোঝ? এক্সপ্রেশন / স্ট্রিংয়ে কেবল একটি বার রয়েছে। ধন্যবাদ
জিগি

2
@ জিগি স্ট্রিংটি পরীক্ষিত হচ্ছে হ'ল "ফুবারবারফু"। আপনি দেখতে পাচ্ছেন যে স্ট্রিংয়ে দুটি ফু এবং দুটি বার রয়েছে।
স্কাইফুট

4
কেউ যখন পারমাণবিক গোষ্ঠী প্রয়োজন হতে পারে ব্যাখ্যা করতে পারেন? আমার যদি কেবল প্রথম বিকল্পের সাথেই মেলে প্রয়োজন হয় তবে আমি কেন একাধিক বিকল্প দিতে চাই?
আরভিমান

2
পারমাণবিক গ্রুপ সম্পর্কে ভাল ব্যাখ্যাএই উত্তর । এই ডায়টিক উত্তরটি সম্পূর্ণ করতে কেউ এখানে সম্পাদনা করতে পারবে?
পিটার ক্রাউস

5
কেবলমাত্র একটি দ্রষ্টব্য যে আমি যখন এমন একটি প্রকল্পের জন্য শেষ করি যখন এই গুরুতর রেইজেক্স চপগুলির প্রয়োজন ছিল তখন এই উত্তরটি প্রয়োজনীয় ছিল। এটি চেহারাগুলির চারপাশের একটি দুর্দান্ত, সংক্ষিপ্ত বিবরণ।
টম কাফলিন

215

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

আরও তথ্যের জন্য নিয়মিত- এক্সপ্রেশন.ডিন.ফো পড়ুন ।

  • ইতিবাচক চেহারা:

বাক্য গঠন:

(?=REGEX_1)REGEX_2

আরইজিএক্স_1 মিললে কেবল ম্যাচ; REGEX_1 এর সাথে মিলে যাওয়ার পরে, ম্যাচটি বাতিল করা হয় এবং REGEX_2 অনুসন্ধান করা একই অবস্থান থেকে শুরু হয়।

উদাহরণ:

(?=[a-z0-9]{4}$)[a-z]{1,2}[0-9]{2,3}

আরইজিইএক্স_1 [a-z0-9]{4}$যা চারটি বর্ণমালার অক্ষরের সাথে মিলিত হয় এবং তারপরে লাইনের শেষে থাকে।
REGEX_2 হ'ল [a-z]{1,2}[0-9]{2,3}যা দুটি বা তিনটি অঙ্কের পরে এক বা দুটি বর্ণের সাথে মেলে।

REGEX_1 নিশ্চিত করে যে স্ট্রিংয়ের দৈর্ঘ্য প্রকৃতপক্ষে 4, তবে কোনও অক্ষর গ্রাস করে না যাতে REGEX_2 অনুসন্ধান একই জায়গায় শুরু হয়। এখন আরইজিএক্স_2 নিশ্চিত করে যে স্ট্রিংটি কিছু অন্যান্য নিয়মের সাথে মেলে। চেহারা-এগিয়ে ছাড়া এটি দৈর্ঘ্যের তিনটি বা পাঁচটির সাথে মেলে।

  • নেতিবাচক চেহারা

বাক্য গঠন:

(?!REGEX_1)REGEX_2

আরজিইজি_1 টি মেলে না তবেই মিলবে; REGEX_1 চেক করার পরে, REGEX_2 অনুসন্ধান একই অবস্থানে শুরু হয়।

উদাহরণ:

(?!.*\bFWORD\b)\w{10,30}$

চেহারা-সামনের অংশটি FWORDস্ট্রিংয়ের জন্য পরীক্ষা করে এবং এটি যদি এটি খুঁজে পায় তবে ব্যর্থ হয়। যদি এটি না পাওয়া যায় FWORDতবে চেহারাটি সফল হয় এবং নীচের অংশটি যাচাই করে যে স্ট্রিংয়ের দৈর্ঘ্য 10 থেকে 30 এর মধ্যে এবং এটিতে কেবলমাত্র শব্দের অক্ষর রয়েছেa-zA-Z0-9_

চেহারা-পিছনে চেহারা-সামনের অনুরূপ: এটি কেবল বর্তমান কার্সারের অবস্থানের পিছনে দেখায়। জাভাস্ক্রিপ্টের মতো কিছু রিজেেক্স স্বাদগুলি লুক-পিছনের দৃser়তাগুলিকে সমর্থন করে না। এবং বেশিরভাগ স্বাদ যা এটি সমর্থন করে (পিএইচপি, পাইথন ইত্যাদি) নির্দিষ্ট দৈর্ঘ্যের জন্য লুক-পিছনের অংশটি প্রয়োজন।

  • পারমাণবিক গোষ্ঠীগুলি মূলত টোকেন ম্যাচ হলে গ্রুপে পরবর্তী টোকেনগুলি বাতিল / ভুলে যায়। পারমাণবিক গোষ্ঠীর উদাহরণের জন্য এই পৃষ্ঠাটি দেখুন

আপনার ব্যাখ্যার পরে, জাভাস্ক্রিপ্টে কাজ করছে বলে মনে হচ্ছে না, /(?=source)hello/.exec("source...hummhellosource ") = নাল। আপনার ব্যাখ্যা সঠিক?
হেলিন ওয়াং

@ হেলিনওয়াং এই ব্যাখ্যাটি সঠিক। আপনার রেজেক্স এমন একটি স্ট্রিং প্রত্যাশা করেছে যা একই সাথে উত্স এবং হ্যালো উভয়ই!
আমারঘোষ

@jddxf বিস্তৃত যত্ন?
আমারঘোষ

@ অমরঘোষ আমি একমত হয়েছি "তারা একটি রেজেেক্স (বর্তমান অবস্থানের ডান বা বাম দিকে - সামনে বা পিছনের উপর ভিত্তি করে) অনুসন্ধান করে, কোনও ম্যাচ পাওয়া গেলে সফল হয় বা ব্যর্থ হয় (এটি যদি ইতিবাচক বা নেতিবাচক থাকে তার ভিত্তিতে) এবং ম্যাচটি বাতিল করে দেয়" অংশ। "। সুতরাং লুকোহেডের বর্তমান অবস্থানের ডানদিকে একটি রেজেক্স পরীক্ষা করা উচিত এবং ইতিবাচক চেহারাটির বাক্য
গঠনটি

@Amarghosh হবে (?=REGEX_1)REGEX_2শুধুমাত্র মেলে তাহলে REGEX_2আসে পরে REGEX_1 ?
এন্ডিস

0

খাঁজ কাটা দ্রুত দেখা।
কিভাবে চেহারা এবং পিছনে চেহারা পার্থক্য? আমার সাথে 2 মিনিট ট্যুর নিন:

(?=) - positive lookahead
(?<=) - positive lookbehind

অনুমান করা

    A  B  C #in a line

এখন, আমরা বি কে জিজ্ঞাসা করি, তুমি কোথায়?
এটির অবস্থান ঘোষণা করার জন্য বি এর দুটি সমাধান রয়েছে:

এক, বি এর এগিয়ে আছে এবং সি বেবিন্ড
টু রয়েছে, বি এগিয়ে রয়েছে সি এর পিছনে (লুকোহেড) এ এবং পিছনে (লুকিয়েহন্ড) এ

আমরা দেখতে পাচ্ছি, পিছনে এবং সামনে দুটি সমাধানের বিপরীতে।
রেজেক্স হ'ল সমাধান দুটি।

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