রেগেক্স গল্ফ জন্য টিপস


43

ভাষা-নির্দিষ্ট গল্ফিং টিপসের জন্য আমাদের থ্রেডগুলির মতো: নিয়মিত প্রকাশগুলি সংক্ষিপ্ত করার জন্য সাধারণ কৌশলগুলি কী কী?

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

যথারীতি, দয়া করে উত্তরের জন্য একটি টিপ (বা খুব ঘনিষ্ঠভাবে সম্পর্কিত টিপসের পরিবার) এ লেগে থাকুন, যাতে সর্বাধিক দরকারী টিপস ভোটের মাধ্যমে শীর্ষে উঠতে পারে।


ফ্ল্যাগরেন্ট স্ব-প্রচার: এটি কোন শ্রেণীর রেজেক্স-ব্যবহারের মধ্যে পড়ে? কোডগল্ফ.স্ট্যাক্কেঞ্জাঞ্জিও
কাইল স্ট্র্যান্ড

@ কাইলস্ট্র্যান্ড "বৃহত্তর গল্ফ কোডের অংশ হিসাবে ব্যবহৃত নিয়মিত প্রকাশ।"
মার্টিন এন্ডার

উত্তর:


24

কখন পালাতে হবে না

এই বিধিগুলি বেশিরভাগ স্বাদে প্রযোজ্য:

  • ] মেলে না যখন পালানোর দরকার নেই।

  • {এবং }যখন তারা পুনরাবৃত্তির অংশ না হয়, তখন তাদের পালানোর দরকার হয় না, যেমন আক্ষরিক {a}মিল matches {a}এমনকি আপনি যদি এর মতো কোনও কিছুর সাথে মিল রাখতে চান তবে আপনাকে {2}কেবল তার মধ্যে একটির থেকে পালাতে হবে, যেমন {2\}

চরিত্র শ্রেণিতে:

  • ]চরিত্রের সেটটিতে এটি প্রথম অক্ষরের সাথে পালানোর দরকার নেই, যেমন []abc]একটির সাথে মেলে ]abc, বা এটি যখন এর পরে এটি দ্বিতীয় চরিত্রের সাথে ^, যেমন [^]]কোনও কিছুর সাথে মেলে ]। (উল্লেখযোগ্য ব্যতিক্রম: ECMAScript স্বাদ!)

  • [মোটেও পালানোর দরকার নেই। উপরের টিপটির সাথে একত্রে এর অর্থ আপনি উভয় বন্ধনকে মারাত্মকভাবে পাল্টা স্বজ্ঞাত চরিত্রের ক্লাসের সাথে মেলাতে পারেন [][]

  • ^যখন অক্ষর সেটে এটি প্রথম অক্ষর নয় , তখন পালানোর দরকার নেই [ab^c]

  • -^অক্ষর সেটটিতে প্রথম (ক এর পরে দ্বিতীয় ) বা শেষ অক্ষর যেমন পালনের দরকার নেই [-abc], [^-abc]বা [abc-]

  • অক্ষর শ্রেণীর বাইরে মেটা অক্ষর হলেও (ব্যাকস্ল্যাশ \নিজেই ব্যতীত ) অন্য কোনও অক্ষরকে অক্ষর শ্রেণীর অভ্যন্তরে পালানোর দরকার নেই ।

এছাড়াও, কিছু স্বাদে ^এবং $আক্ষরিক সাথে মিলিত হয় যখন তারা যথাক্রমে রেজেক্সের শুরু বা শেষে হয় না।

(কয়েকটি বিবরণ পূরণের জন্য @ মার্টিনব্যাটনারকে ধন্যবাদ)


কেউ কেউ প্রকৃত বিন্দুটিকে একটি অক্ষর শ্রেণিতে ঘিরে রেখে পালাতে পছন্দ করেন যেখানে এটির পালানোর প্রয়োজন হয় না (উদাঃ [.])। এটিকে \.
এড়াতে

নোট করুন যে [জাভাতে পালাতে হবে। যদিও আইসিইউ (অ্যান্ড্রয়েড এবং আইওএস এ ব্যবহৃত) বা। নেট সম্পর্কে নিশ্চিত নন।
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

18

ASCII সারণীতে সমস্ত মুদ্রণযোগ্য অক্ষরগুলির সাথে মেলে একটি সাধারণ নিয়মিত প্রকাশ ।

[ -~]

1
খাঁটি দুর্দান্ততা, একটি স্ট্যান্ডার্ড মার্কিন কীবোর্ড থেকে সমস্ত অক্ষর! দ্রষ্টব্য: স্ট্যান্ডার্ড এস্কি টেবিল (বর্ধিত পরিসীমা 127-255 সহ নয়
CSᵠ

আমি এটি প্রায়শই ব্যবহার করি তবে এটি একটি সাধারণ "নিয়মিত" চরিত্র: অনুপস্থিত। এবং এটি ধরে নিয়েছে যে আপনি LC_ALL = "C" (বা অনুরূপ) ব্যবহার করছেন কারণ কিছু অন্যান্য লোকেল ব্যর্থ হবে।
অলিভিয়ার ডুলাক

হাইফেন কি ASCII টেবিলের অক্ষরের কোনও ব্যাপ্তি নির্দিষ্ট করতে ব্যবহার করা যেতে পারে? এটি কি রেজেেক্সের সমস্ত স্বাদের জন্য কাজ করে?
জোশ উইথে

14

আপনার রেজেক্স স্বাদগুলি জানুন

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

পার্ল এবং পিসিআরই

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

  • পুনরাবৃত্তি / subroutines । গল্ফিংয়ের জন্য সম্ভবত সবচেয়ে গুরুত্বপূর্ণ বৈশিষ্ট্য (যা কেবল কয়েকটি স্বাদে বিদ্যমান)।
  • শর্তাধীন নিদর্শন (?(group)yes|no)
  • সমর্থন দিয়ে প্রতিস্থাপন স্ট্রিং মামলার পরিবর্তন \l, \u, \Lএবং \U
  • পিসিআরআই লুকের পিছনে পরিবর্তনের অনুমতি দেয়, যেখানে প্রতিটি বিকল্পের আলাদা (তবে স্থির) দৈর্ঘ্য থাকতে পারে। (পার্ল সহ বেশিরভাগ স্বাদের সামগ্রিক নির্দিষ্ট দৈর্ঘ্যের জন্য লুকবিহাইন্ডগুলি প্রয়োজন))
  • \G আগের ম্যাচ শেষে একটি ম্যাচ অ্যাঙ্কর করতে।
  • \K ম্যাচের শুরুটি পুনরায় সেট করতে
  • পিসিআরই ইউনিকোড অক্ষর বৈশিষ্ট্য এবং স্ক্রিপ্ট উভয় সমর্থন করে ।
  • \Q...\Eঅক্ষর দীর্ঘ রান চালাতে। আপনি যখন অনেকগুলি মেটা-অক্ষরযুক্ত স্ট্রিংয়ের সাথে মেলে চেষ্টা করছেন তখন দরকারী।

.NET

এটি খুব শক্তিশালী স্বাদ, খুব কম কমতি রয়েছে com

গল্ফিংয়ের ক্ষেত্রে একটি গুরুত্বপূর্ণ অসুবিধা হ'ল এটি অন্য কিছু স্বাদের মতো অধিক পরিমাণে কোয়ান্টিফায়ার সমর্থন করে না। পরিবর্তে .?+আপনাকে লিখতে হবে (?>.?)

জাভা

  • ত্রুটির কারণে (পরিশিষ্ট দেখুন) জাভা সীমিত প্রকারের চলক-দৈর্ঘ্যের বর্ণনক্ষেত্রের সমর্থন করে: আপনি স্ট্রিংয়ের শুরু পর্যন্ত সমস্ত পথের পিছনে নজর .*দিতে পারেন যেখানে আপনি এখন থেকে লুপহ্যাড শুরু করতে পারেন, এর মতো (?<=(?=lookahead).*)
  • ইউনিয়ন এবং চরিত্র শ্রেণীর ছেদ সমর্থন করে।
  • "ইউনিকোড স্ক্রিপ্টস, ব্লকস, বিভাগ এবং বাইনারি বৈশিষ্ট্যগুলির" জন্য অক্ষর শ্রেণীর সাথে ইউনিকোডের সর্বাধিক বিস্তৃত সমর্থন রয়েছে ।
  • \Q...\E পার্ল / পিসিআরই হিসাবে

চুনি

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

গল্ফিংয়ের ক্ষেত্রে সবচেয়ে দরকারী বৈশিষ্ট্যটি হ'ল রুবি কীভাবে কোয়ান্টিফায়ারগুলিকে পরিচালনা করে। সর্বাধিক উল্লেখযোগ্যভাবে, প্রথম বন্ধনী ছাড়াই বাসা বাঁধাই সম্ভব। .{5,7}+কাজ করে এবং তাই করে .{3}?। এছাড়াও অন্যান্য বেশিরভাগ স্বাদের বিপরীতে, কোয়ান্টিফায়ারের নীচের অংশে যদি 0এটি বাদ দেওয়া যায় তবে এটি .{,5}সমান .{0,5}

সাবরুটাইনগুলি হিসাবে, পিসিআরই সাব্রুটাইনস এবং রুবির সাবরুটাইনগুলির মধ্যে প্রধান পার্থক্যটি হ'ল রুবির সিনট্যাক্সটি বাইট লম্বা (?n)বনাম \g<n>, তবে রুবির সাবরুটাইনগুলি ক্যাপচারের জন্য ব্যবহার করা যেতে পারে, যেখানে পিসিআরই সাব্রোটাইন শেষ হওয়ার পরে ক্যাপচারগুলি পুনরায় সেট করে।

অবশেষে, রুবির অন্যান্য স্বাদের তুলনায় লাইন-সম্পর্কিত সংশোধকগুলির জন্য বিভিন্ন শব্দার্থক শব্দ রয়েছে। সাধারণত mঅন্যান্য স্বাদে যে সংশোধকটি ডাকা হয় তা রুবিতে সর্বদা চালু থাকে। সুতরাং ^এবং $সর্বদা একটি স্ট্রিংয়ের শুরু এবং শেষের সাথে নয় তবে একটি লাইনের শুরু এবং শেষের সাথে মেলে । আপনার যদি এই আচরণের প্রয়োজন হয় তবে এটি আপনাকে একটি বাইট সংরক্ষণ করতে পারে, তবে আপনি যদি না করেন তবে আপনার অতিরিক্ত বাইট খরচ হবে, কারণ আপনাকে যথাক্রমে প্রতিস্থাপন করতে হবে ^এবং $সহ \Aএবং করতে হবে \z। এটির পরিবর্তে , পরিবর্তককে সাধারণত বলা হয় s(যা .ম্যাচ লাইনফিডগুলি তৈরি করে) mপরিবর্তে রুবিতে ডাকা হয়। এটি বাইট গণনাগুলিকে প্রভাবিত করে না, তবে বিভ্রান্তি এড়াতে মনে রাখা উচিত।

পাইথন

পাইথনের একটি শক্ত স্বাদ রয়েছে তবে আমি বিশেষভাবে দরকারী বৈশিষ্ট্যগুলি সম্পর্কে অবগত নই যা আপনি অন্য কোথাও পাবেন না।

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

এর নাম ECMAScript

ECMAScript স্বাদটি খুব সীমাবদ্ধ, এবং তাই গল্ফ করার জন্য খুব কমই খুব কার্যকর। এটি কেবল যেটির জন্য যাচ্ছে তা হ'ল নিরক্ষর শূন্য চরিত্রের শ্রেণিটি[^] কোনও চরিত্রের সাথে মেলে ধরার পাশাপাশি শর্তহীনভাবে ব্যর্থ হওয়া খালি চরিত্রের শ্রেণি [](সাধারণের বিপরীতে (?!))। দুর্ভাগ্যক্রমে, স্বাদে এমন কোনও বৈশিষ্ট্য নেই যা আধুনিক সমস্যার জন্য আধুনিককে দরকারী করে তোলে।

অ্যাপ্লিকেশন Lua

লুয়ার নিজস্ব মোটামুটি অনন্য স্বাদ রয়েছে, যা বেশ সীমাবদ্ধ (যেমন আপনি গোষ্ঠীগুলির পরিমাণও নির্ধারণ করতে পারবেন না) তবে এটি বেশ কয়েকটি দরকারী এবং আকর্ষণীয় বৈশিষ্ট্য নিয়ে আসে।

  • বিরামচিহ্ন, উচ্চ / নিম্নের অক্ষর এবং হেক্স অঙ্ক সহ অন্তর্নির্মিত অক্ষর শ্রেণীর জন্য এটি সংখ্যক শর্টহ্যান্ড পেয়েছে ।
  • সঙ্গে %bএটি একটি খুব কম্প্যাক্ট সিনট্যাক্স সমর্থন সুষম স্ট্রিং মেলে। উদাহরণস্বরূপ %b()একটি (এবং তারপরে সবকিছু মিলে যায় )(সঠিকভাবে অভ্যন্তরীণ ম্যাচিং জোড়াগুলি এড়িয়ে যাওয়া)। (এবং )এখানে যে কোনও দুটি চরিত্র হতে পারে।

সাহায্য

বুস্টের রেগেক্স গন্ধটি মূলত পার্লের। যাইহোক, কেস পরিবর্তন এবং শর্তসাপেক্ষ সহ রেজেক্সে প্রতিস্থাপনের জন্য এটিতে বেশ কয়েকটি নতুন নতুন বৈশিষ্ট্য রয়েছে । পরেরটি বুস্টের কাছে যতটা আমি সচেতন ততই অনন্য।


নোট করুন যে লুক-ফরোয়ারে লুক-ফরোয়ার্ড লুক-ব্যাকের সীমাবদ্ধতার মধ্য দিয়ে খোঁচা দেবে। জাভা এবং পিসিআরই পরীক্ষিত।
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

.?+সমান নয় কি .*?
ক্যালকুলেটরলাইন

@ ক্যালকুলেটরফলাইন প্রাক্তনটি হ'ল 0 বা 1-কোয়ানটিফায়ার (স্বাদে যেগুলি অধিকতর কোয়ান্টিফায়ারকে সমর্থন করে), পরেরটি 0 বা আরও বেশি পরিমাণযুক্ত is
মার্টিন ইন্ডার

@ ক্যালকুলেটরফ্লাইন আহ আমি বিভ্রান্তি বুঝতে পেরেছি। টাইপো ছিল।
মার্টিন ইন্ডার

13

আপনার চরিত্রের ক্লাসগুলি জানুন

বেশিরভাগ রেজেক্স স্বাদের পূর্বনির্ধারিত চরিত্রের ক্লাস রয়েছে। উদাহরণস্বরূপ, \dএকটি দশমিক অঙ্ক, যা তিন চেয়ে খাটো বাইট সাথে মিলে যায় [0-9]। হ্যাঁ, এগুলি কিছুটা আলাদা হতে পারে কারণ \dকিছু স্বাদে ইউনিকোড অঙ্কগুলিও মেলে, তবে বেশিরভাগ চ্যালেঞ্জের ক্ষেত্রে এটি কোনও তাত্পর্যপূর্ণ করবে না।

বেশিরভাগ রেজেেক্স স্বাদে এখানে কয়েকটি অক্ষর শ্রেণি পাওয়া যায়:

\d      Match a decimal digit character
\s      Match a whitespace character
\w      Match a word character (typically [a-zA-Z0-9_])

উপরন্তু, আমরা এছাড়াও আছে:

\D \S \W

যা উপরোক্ত সংস্করণগুলির উপেক্ষিত।

এটির যে কোনও অতিরিক্ত অক্ষর শ্রেণীর জন্য আপনার গন্ধটি পরীক্ষা করতে ভুলবেন না। উদাহরণস্বরূপ, পিসিআরই নিউলাইনলাইনগুলির \Rজন্য এবং লুয়া এমনকি ছোট ছোট এবং বড় হাতের অক্ষরের মতো ক্লাসও রাখে has

(এগুলি দেখানোর জন্য @ হামজা এবং @ মার্টিনব্যাটনারকে ধন্যবাদ)


3
\Rপিসিআরইতে নতুন লাইনের জন্য
হামজা

12

ক্যাপচার না করা গ্রুপগুলি নিয়ে বিরক্ত করবেন না (যদি না ...)

এই টিপটি সমস্ত জনপ্রিয় পার্ল-অনুপ্রাণিত স্বাদের জন্য (কমপক্ষে) প্রযোজ্য।

এটি সুস্পষ্ট হতে পারে তবে (যখন গল্ফিং করবেন না) (?:...)যখনই সম্ভব নন-ক্যাপচারিং গ্রুপগুলি ব্যবহার করা ভাল অনুশীলন । এই দুটি অতিরিক্ত অক্ষর ?:যদিও গল্ফ করার সময় অপব্যয়যোগ্য, তাই কেবল ক্যাপচারিং গ্রুপগুলি ব্যবহার করুন, এমনকি যদি আপনি সেগুলি পিছনে উল্লেখ না করেন।

যদিও এর মধ্যে একটি (বিরল) ব্যতিক্রম রয়েছে: আপনি যদি 10কমপক্ষে 3 বার ব্যাকগ্রিফিক্স গ্রুপে হন, আপনি আসলে পূর্ববর্তী গোষ্ঠীটিকে একটি নন-ক্যাপচারিং গ্রুপে পরিণত করে বাইটগুলি সংরক্ষণ করতে পারেন, যেমন সমস্তগুলি \10এস হয়ে যায় \9। (অনুরূপ কৌশলগুলি প্রয়োগ করা হয়, যদি আপনি 11কমপক্ষে 5 বার গ্রুপ ব্যবহার করেন))


যখন 10 এর 3 প্রয়োজন তখন 11 কেন এটির জন্য 5 বার প্রয়োজন?
নিক হার্টলি

1
@ কিপায়সট্যাক্সগুলি ব্যবহার করতে সক্ষম হয়ে যাবার $9পরিবর্তে $10বা $11একবারে একটি বাইট সংরক্ষণ করে। বাঁক $10মধ্যে $9এক প্রয়োজন ?:যাতে আপনি তিন প্রয়োজন হবে, যা দুই বাইট $10কিছু সংরক্ষণ করতে গুলি। $11রূপান্তর করতে $9দুটি বুকের প্রয়োজন ?:যা চারটি বাইট, সুতরাং আপনার $11কিছু সংরক্ষণের জন্য পাঁচটি প্রয়োজন (বা পাঁচটি $10এবং $11সংযুক্ত)।
মার্টিন ইন্ডার

10

প্যাটার্ন পুনরায় ব্যবহারের জন্য পুনরাবৃত্তি

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

...someComplexPatternHere...someComplexPatternHere...someComplexPatternHere... 

পার্ল / পিসিআরই তে আপনি করতে পারেন:

...(someComplexPatternHere)...(?1)...(?1)...

বা রুবিতে:

...(someComplexPatternHere)...\g<1>...\g<1>...

প্রথম গ্রুপটি সরবরাহ করা (অবশ্যই আপনি পুনরাবৃত্তির কলটিতে যে কোনও নম্বর ব্যবহার করতে পারেন)।

মনে রাখবেন যে এটি ব্যাকরফারেন্স ( ) হিসাবে একই নয়\1 । ব্যাকরিফারেন্সগুলি গ্রুপটি শেষ বারের সাথে মিলছে ঠিক একই স্ট্রিংয়ের সাথে মেলে। এই সাবরুটাইন কলগুলি আসলে আবার প্যাটার্নটিকে মূল্যায়ন করে। someComplexPatternHereএকটি দীর্ঘ চরিত্রের ক্লাস গ্রহণের উদাহরণ হিসাবে :

a[0_B!$]b[0_B!$]c[0_B!$]d

এটি কিছু মিলবে

aBb0c!d

মনে রাখবেন যে আচরণটি সংরক্ষণের সময় আপনি এখানে ব্যাক-রেফারেন্স ব্যবহার করতে পারবেন না। উপরোক্ত স্ট্রিংটিতে একটি ব্যাকফেরেন্স ব্যর্থ হবে, কারণ Bএবং 0এবং !একই নয়। তবে সাবরুটিন কল সহ, প্যাটার্নটি আসলে পুনরায় মূল্যায়ন করা হয়। উপরের প্যাটার্নটি সম্পূর্ণরূপে সমতুল্য

a([0_B!$])b(?1)c(?1)d

সাবরুটিন কলগুলিতে ক্যাপচার করা হচ্ছে

পার্ল এবং পিসিআরই-এর সাবধানতার একটি নোট: 1উপরের উদাহরণগুলির মধ্যে গ্রুপে আরও গ্রুপ রয়েছে, তবে সাব্রোটিন কলগুলি তাদের ক্যাপচারগুলি মনে রাখবে না। এই উদাহরণ বিবেচনা করুন:

(\w(\d):)\2 (?1)\2 (?1)\2

এটি মিলবে না

x1:1 y2:2 z3:3

কারণ সাবরুটাইন কলগুলি ফিরে আসার পরে, গ্রুপের নতুন ক্যাপচারটি 2বাতিল করা হয়েছে। পরিবর্তে, এই প্যাটার্নটি এই স্ট্রিংটির সাথে মিলবে:

x1:1 y2:1 z3:1

এই রুবি, যেখানে সাবরুটিন কল থেকে ভিন্ন না তাই সমতুল্য রুবি Regex, তাদের যেমনটি ধরে রাখা (\w(\d):)\2 \g<1>\2 \g<1>\2উপরের উদাহরণগুলোতে প্রথম মেলে যাবে।


আপনি \1জাভাস্ক্রিপ্ট জন্য ব্যবহার করতে পারেন । এবং পিএইচপি খুব (আমার ধারণা)।
ইসমাইল মিগুয়েল

5
@ ইসমাইল মিগুয়েল এটি কোনও পিছনের বিষয় নয়। এটি আসলে আবার প্যাটার্নটি মূল্যায়ন করে। উদাহরণস্বরূপ (..)\1মিলবে ababতবে ব্যর্থ হবে abbaযেখানে (..)(?1)পরেরটির সাথে মেলে। এটি প্রকৃত অর্থে একটি সাবউরটিন কল যা গতবারের সাথে যা মিলছে তার সাথে আক্ষরিক মিলের পরিবর্তে অভিব্যক্তিটি আবার প্রয়োগ করা হয়েছে।
মার্টিন ইন্ডার

বাহ, আমার কোনও ধারণা ছিল না! প্রতিদিন নতুন কিছু শিখতে
ইসমাইল মিগুয়েল

নেট (বা এই বৈশিষ্ট্য ছাড়া অন্য স্বাদ):(?=a.b.c)(.[0_B!$]){3}d
জিমি 23013

@ ব্যবহারকারী23013 যা এই বিশেষ উদাহরণটির সাথে খুব নির্দিষ্ট বলে মনে হচ্ছে। আমি নিশ্চিত না যে এটি প্রযোজ্য যদি আমি বিভিন্ন বর্ণমালার মধ্যে একটি নির্দিষ্ট সাবপ্যাটার ব্যবহার করি।
মার্টিন ইন্ডার

9

কোনও ম্যাচ ব্যর্থ হওয়ার কারণ

গণনামূলক সমস্যাগুলি সমাধান করতে বা অত্যন্ত অ-নিয়মিত ভাষাগুলির সাথে মিলে যাওয়ার জন্য যখন রেইগেক্স ব্যবহার করা হয় তখন কখনও কখনও আপনি যেখানে থাকছেন না কেন প্যাটার্নের কোনও শাখাটি ব্যর্থ করে ফেলা প্রয়োজন। নিখরচায় দৃষ্টিভঙ্গি হ'ল একটি খালি নেতিবাচক চেহারা অবলম্বন করা:

(?!)

সামগ্রীগুলি (খালি প্যাটার্ন) সর্বদা মেলে তাই নেতিবাচক চেহারা সর্বদা ব্যর্থ হয়। তবে প্রায়শই না করার চেয়ে অনেক সহজ বিকল্প রয়েছে: কেবলমাত্র এমন একটি অক্ষর ব্যবহার করুন যা আপনি জানেন যে ইনপুটটিতে কখনই উপস্থিত হবে না। উদাহরণস্বরূপ, যদি আপনি জানেন যে আপনার ইনপুটটিতে সর্বদা কেবলমাত্র অঙ্ক থাকে তবে আপনি কেবল ব্যবহার করতে পারেন

!

বা অন্য কোনও অ-অঙ্ক, অ-মেটা অক্ষর ব্যর্থতার কারণ হতে পারে।

এমনকি যদি আপনার ইনপুটটিতে কোনও সাবস্ট্রিং থাকতে পারে তবে এর চেয়ে আরও ছোট উপায় রয়েছে (?!)। যে কোনও স্বাদ যা অ্যাঙ্করদের শেষের বিপরীতে কোনও প্যাটার্নের মধ্যে উপস্থিত হতে দেয়, নিম্নলিখিত 2-চরিত্রের সমাধানগুলি ব্যবহার করতে পারে:

a^
$a

তবে খেয়াল করুন যে কিছু স্বাদগুলি এই অবস্থানগুলিতে ^এবং $আক্ষরিক চরিত্র হিসাবে বিবেচিত হবে , কারণ এগুলি সম্ভবত অ্যাঙ্কর হিসাবে প্রকৃত অর্থে বোঝায় না।

ECMAScript স্বাদে বরং মার্জিত 2-চরিত্রের সমাধানও রয়েছে

[]

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


8

আপনাকে অনুকূলিত করুন

আপনার রেজিএক্সে যখনই আপনার 3 বা ততোধিক বিকল্প রয়েছে:

/aliceblue|antiquewhite|aquamarine|azure/

একটি সাধারণ শুরু আছে কিনা তা পরীক্ষা করে দেখুন:

/a(liceblue|ntiquewhite|quamarine|zure)/

এবং এমনকি এমনকি একটি সাধারণ সমাপ্তি?

/a(liceblu|ntiquewhit|quamarin|zur)e/

দ্রষ্টব্য: 3 কেবলমাত্র শুরু এবং একই দৈর্ঘ্যের জন্য অ্যাকাউন্ট হয়, 4+ পার্থক্য করতে পারে


তবে তাদের সকলের যদি একটি সাধারণ উপসর্গ না থাকে? (কেবল স্পষ্টতার জন্য সাদা স্থান যোগ করা হয়েছে)

/aliceblue|antiquewhite|aqua|aquamarine|azure
|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood
|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan/

তাদের গ্রুপ করুন, যতক্ষণ না 3+ নিয়মটি বোঝায়:

/a(liceblue|ntiquewhite|qua|quamarine|zure)
|b(eige|isque|lack|lanchedalmond|lue|lueviolet|rown|urlywood)
|c(adetblue|hartreuse|hocolate|oral|ornflowerblue|ornsilk|rimson|yan)/

অথবা এমনকি এনট্রপি আপনার ব্যবহারের কেসটি সন্তুষ্ট করলে সাধারণীকরণ করুন:

/\w(liceblue|ntiquewhite|qua|quamarine|zure
|eige|isque|lack|lanchedalmond|lue|lueviolet|rown|urlywood
|adetblue|hartreuse|hocolate|oral|ornflowerblue|ornsilk|rimson|yan)/

^ এই ক্ষেত্রে আমরা নিশ্চিত আমরা কোনো না clueবাcrown slack Ryan

এটি "কিছু পরীক্ষা অনুসারে" কর্মক্ষমতাও উন্নত করে, কারণ এটি শুরু করার জন্য একটি অ্যাঙ্কর সরবরাহ করে।


1
যদি সাধারণ শুরু বা শেষটি একটি চরিত্রের চেয়ে দীর্ঘ হয়, এমনকি দুটি গ্রুপ করাও পার্থক্য করতে পারে। ভালো লেগেছে aqua|aquamarineaqua(|marine)বা aqua(marine)?
পাওলো ইবারম্যান

6

এটি একটি মোটামুটি সহজ, তবে উল্লেখ করার মতো:

আপনি যদি নিজেকে চরিত্রের শ্রেণীর পুনরাবৃত্তি করতে দেখতে পান তবে আপনি [a-zA-Z]সম্ভবত আপনার রেজেক্সে ( কেস- আই এনসেসিটিভ মডিফায়ার) ব্যবহার করতে পারেন [a-z]এবং যুক্ত করতে পারেন ।i

উদাহরণস্বরূপ, রুবিতে, নিম্নলিখিত দুটি রেজেক্স সমান:

/[a-zA-Z]+\d{3}[a-zA-Z]+/
/[a-z]+\d{3}[a-z]/i - 7 বাইট সংক্ষিপ্ত

এই বিষয়টির জন্য, অন্যান্য সংশোধকগুলি আপনার মোট দৈর্ঘ্যটিও সংক্ষিপ্ত করতে পারে। এটি করার পরিবর্তে:

/(.|\n)/

যা কোনও চরিত্রের সাথে মেলে (কারণ বিন্দুটি নতুন লাইনের সাথে মেলে না), এস ইনলেগ-লাইন সংশোধক ব্যবহার করুন s, যা ডটকে নতুন ম্যাচগুলি তৈরি করে।

/./s - 3 বাইট সংক্ষিপ্ত


রুবিতে, রেগেক্সের জন্য এক টন বিল্ট-ইন ক্যারেক্টার ক্লাস রয়েছে। এই পৃষ্ঠাটি দেখুন এবং "চরিত্রের বৈশিষ্ট্য" অনুসন্ধান করুন।
একটি দুর্দান্ত উদাহরণ হ'ল "মুদ্রার প্রতীক"। উইকিপিডিয়া অনুসারে এখানে প্রচুর মুদ্রা প্রতীক রয়েছে এবং এগুলি একটি অক্ষর শ্রেণিতে স্থাপন করা খুব ব্যয়বহুল ( [$฿¢₡Ð₫€.....]) হবে যেখানে আপনি যে কোনওটির সাথে 6 বাইটের সাথে মেলে করতে পারেন:\p{Sc}


1
জাভাস্ক্রিপ্ট ব্যতীত, যেখানে sসংশোধক সমর্থিত নয়। :( কিন্তু জাভাস্ক্রিপ্ট এর মালিকানা ব্যবহার করতে পারেন /[^]/কৌতুক।
manatwork

নোট করুন যে (.|\n)এমনকি কিছু স্বাদেও কাজ করে না, কারণ .প্রায়শই অন্যান্য ধরণের লাইন বিভাজকের সাথেও মেলে না। যাইহোক, এটি করার (প্রচলিত s) প্রথাগত উপায় হ'ল [\s\S]যা একই বাইট (.|\n)
মার্টিন ইন্ডার

@ মার্টিনবাটনার, আমার ধারণা এটি অন্যান্য লাইনের সাথে সম্পর্কিত টিপসের সাথে একত্রে রাখার ছিল। তবে আপনি যদি মনে করেন এই উত্তরটি সংশোধনকারীদের সম্পর্কে বেশি, আপনি যদি এটি পুনরায় পোস্ট করেন তবে আমার কোনও আপত্তি নেই।
manatwork

@ মানাটওয়ার্ক সম্পন্ন হয়েছে (এবং এর সাথে সম্পর্কিত একটি নন-ইএস নির্দিষ্ট কৌশলও যুক্ত করেছে)
মার্টিন এন্ডার

6

একটি সাধারণ ভাষার পার্সার

আপনি আর ই লাই এর মতো খুব সাধারণ পার্সার তৈরি করতে পারেন \d+|\w+|".*?"|\n|\S। আপনার যে টোকেনগুলির সাথে ম্যাচ করতে হবে সেগুলি আরই 'বা' অক্ষরের সাথে পৃথক করা হয়েছে।

প্রতিবারই ইঞ্জিনটি পাঠ্যের বর্তমান অবস্থানে মিলানোর চেষ্টা করলে, এটি প্রথম প্যাটার্নটি চেষ্টা করবে, তারপরে দ্বিতীয়টি ইত্যাদি it । অর্ডার গুরুত্বপূর্ণ। আমরা যদি এই \Sশর্তটি শব্দের আগে রাখি \d+, তবে \Sস্থানটি কোনও স্থানহীন অক্ষরের সাথে প্রথম মিলবে যা আমাদের পার্সারকে ভেঙে ফেলবে।

".*?"তাই আমরা শুধুমাত্র একটি সময়ে এক স্ট্রিং মেলে স্ট্রিং মিলকারীর একটি অ-লোভী পরিবর্তক ব্যবহার করে। যদি আপনার আরই-তে অ-লোভী ফাংশন না থাকে তবে আপনি "[^"]*"যেটি সমতুল্য তা ব্যবহার করতে পারেন ।

পাইথনের উদাহরণ:

text = 'd="dogfinder"\nx=sum(ord(c)*872 for c in "fish"+d[3:])'
pat = r'\d+|\w+|".*?"|\n|\S'
print re.findall(pat, text)

['d', '=', '"dogfinder"', '\n', 'x', '=', 'sum', '(', 'ord', '(', 'c', ')',
    '*', '872', 'for', 'c', 'in', '"fish"', '+', 'd', '[', '3', ':', ']', ')']

গল্ফড পাইথনের উদাহরণ:

# assume we have language text in A, and a token processing function P
map(P,findall(r'\d+|\w+|".*?"|\n|\S',A))

আপনার যে ভাষার সাথে মেলে ধরতে হবে তার জন্য আপনি নিদর্শনগুলি এবং তাদের ক্রম সামঞ্জস্য করতে পারেন। এই কৌশলটি JSON, বেসিক এইচটিএমএল এবং সংখ্যাগত এক্সপ্রেশনগুলির জন্য ভাল কাজ করে works পাইথন 2 এর সাথে এটি সফলভাবে বহুবার ব্যবহৃত হয়েছে, তবে অন্যান্য পরিবেশে কাজ করার জন্য যথেষ্ট সাধারণ হওয়া উচিত।


6

\K পরিবর্তে ইতিবাচক চেহারা পিছনে

পিসিআরই এবং পার্ল পালাবার ক্রমটিকে সমর্থন করে \Kযা ম্যাচের শুরুটি পুনরায় সেট করে। এর জন্য ab\Kcdআপনার ইনপুট স্ট্রিংটি ধারণ করতে abcdহবে তবে রিপোর্ট করা মিলটি কেবলমাত্র হবে cd

আপনি যদি আপনার প্যাটার্নটির শুরুতে ইতিবাচক চেহারাটি ব্যবহার করেন (যা সম্ভবত সবচেয়ে সম্ভবত সম্ভাব্য জায়গা) তবে বেশিরভাগ ক্ষেত্রে আপনি \Kপরিবর্তে ব্যবহার করতে পারেন এবং 3 বাইট সংরক্ষণ করতে পারেন :

(?<=abc)def
abc\Kdef

এটি বেশিরভাগ উদ্দেশ্যে সমান , তবে পুরোপুরি নয়। পার্থক্যগুলি তাদের সাথে উভয় সুবিধা এবং অসুবিধা এনেছে:

  • Uর্ধ্বমুখী: পিসিআরই এবং পার্ল স্বেচ্ছাসেবী দৈর্ঘ্যের বর্ণনক্ষেত্রগুলি সমর্থন করে না (কেবল। নেট তা দেয় না)। অর্থাৎ আপনি এর মতো কিছু করতে পারবেন না (?<=ab*)। তবে \Kআপনি এটির সামনে কোনও ধরণের প্যাটার্ন রাখতে পারেন! তাই ab*\Kকাজ করে। এটি এটি প্রয়োগ করার ক্ষেত্রে প্রকৃতপক্ষে এই কৌশলটিকে আরও বেশি শক্তিশালী করে তোলে।
  • উপরিভাগ: লুকেরাউন্ডগুলি ব্যাকট্র্যাক করে না। আপনি যদি পরে ব্যাকরিফারেন্সের জন্য নজরের পিছনে কিছু ক্যাপচার করতে চান তবে এটি প্রাসঙ্গিক, তবে বেশ কয়েকটি সম্ভাব্য ক্যাপচার রয়েছে যা সবগুলি বৈধ ম্যাচের দিকে পরিচালিত করে। এই ক্ষেত্রে, রেজেক্স ইঞ্জিন কেবল সেই সম্ভাবনারগুলির মধ্যে একবার চেষ্টা করবে। \Kরেজেক্সের সেই অংশটি ব্যবহার করার সময় অন্য সমস্ত কিছুর মতো ব্যাকট্র্যাক করা হচ্ছে।
  • ডাউনসাইড: আপনি সম্ভবত জানেন, একটি রেজেক্সের বেশ কয়েকটি ম্যাচ ওভারল্যাপ করতে পারে না। প্রায়শই, লুকেরাউন্ডগুলি এই সীমাবদ্ধতার আশেপাশে আংশিকভাবে কাজ করতে ব্যবহৃত হয়, যেহেতু লুকোহেড স্ট্রিংয়ের একটি অংশ যা ইতিমধ্যে আগের ম্যাচের দ্বারা গ্রাস করা হয়েছিল তা বৈধতা দিতে পারে। সুতরাং আপনি যদি সমস্ত অক্ষর অনুসরণ করে যা ab আপনি ব্যবহার করতে পারেন তা মেলাতে চাইলে (?<=ab).। ইনপুট দেওয়া হয়েছে

    ababc
    

    এটি দ্বিতীয় aএবং এর সাথে মিলবে c। এটি দিয়ে পুনরুত্পাদন করা যাবে না\K । আপনি যদি ব্যবহার করেন তবে আপনি ab\K.কেবল প্রথম ম্যাচটি পেয়ে যাবেন, কারণ এখন দেখার মতো abনয়।


কোনও প্যাটার্ন যদি \Kইতিবাচক দৃ within়তার মধ্যে অব্যাহতি ক্রম ব্যবহার করে তবে একটি সফল ম্যাচের সূচনা ম্যাচের শেষের চেয়ে বেশি হতে পারে।
hwnd

@hwnd আমার বক্তব্যটি দেওয়া হয়েছে যে ababc, দ্বিতীয় aএবং এর cসাথে মিলের কোনও উপায় নেই \K। আপনি কেবল একটি ম্যাচ পাবেন।
মার্টিন এন্ডার

আপনি সঠিক, বৈশিষ্ট্যটি নিজেই নয়। আপনার সাথে অ্যাঙ্কর করতে হবে\G
hwnd

@hwnd আহ আমি এখন আপনার বক্তব্য দেখতে পাচ্ছি। তবে আমি অনুমান করি যে এই মুহুর্তে (একটি গল্ফিং দৃষ্টিকোণ থেকে) আপনি নেতিবাচক চেহারার পিছনে আরও ভাল আছেন, কারণ সম্ভবত আপনি সম্ভবত এটির প্রয়োজন হতে পারে কারণ আপনি নিশ্চিত হতে পারবেন না যে .শেষ ম্যাচটি আসলে একটি ছিল a
মার্টিন ইন্ডার

1
\ কে =) এর আকর্ষণীয় ব্যবহার
hwnd

5

যে কোনও চরিত্রের সাথে মিলছে

ইসমাস্ক্রিপ্ট স্বাদে সংশোধকগুলির অভাব রয়েছে sযা .কোনও চরিত্রের সাথে মিল রাখে (নিউলাইনগুলি সহ)। এর অর্থ সম্পূর্ণরূপে স্বেচ্ছাচারী চরিত্রের মিলের জন্য কোনও একক-চরিত্রের সমাধান নেই। অন্যান্য স্বাদে স্ট্যান্ডার্ড সমাধান (যখন কেউ কোনও sকারণে ব্যবহার করতে চায় না ) [\s\S]। যাইহোক, এর নাম ECMAScript শুধুমাত্র গন্ধ (আমার জ্ঞান) একটি অনেক খাটো বিকল্প যা খালি চরিত্র শ্রেণীর সমর্থন করে, এবং অত: পর হল: [^]। এটি একটি উপেক্ষিত খালি চরিত্রের শ্রেণি - এটি কোনও বর্ণের সাথে মেলে।

এমনকি অন্যান্য স্বাদের জন্যও আমরা এই কৌশলটি থেকে শিখতে পারি: যদি আমরা ব্যবহার করতে না চাই s(যেমন আমাদের এখনও .অন্য জায়গাগুলির সাধারণ অর্থ প্রয়োজন ) তবে নতুন লাইন এবং মুদ্রণযোগ্য অক্ষর দুটি মিলানোর জন্য আরও একটি ছোট উপায় থাকতে পারে, প্রদত্ত কিছু অক্ষর রয়েছে যা আমরা জানি ইনপুটটিতে উপস্থিত হয় না। বলুন, আমরা নিউলাইন দ্বারা সীমিত সংখ্যার প্রক্রিয়াজাত করছি। তারপরে আমরা যে কোনও চরিত্রের সাথে মেলাতে পারি [^!], কারণ আমরা জানি যে !কখনও স্ট্রিংয়ের অংশ হতে পারে না। এটি নিষ্পাপ [\s\S]বা এর চেয়ে দুটি বাইট সংরক্ষণ করে [\d\n]


4
পার্লে, মোডের বাইরে \Nযা .বোঝায় তার অর্থ /sহ'ল এটি কোনও মোড দ্বারা প্রভাবিত হয় না except
কনরাড বোরোস্কি

4

পারমাণবিক গোষ্ঠী এবং অধিক পরিমাণে ব্যবহার করুন

আমি পারমাণবিক গোষ্ঠী (পাওয়া (?>...)) এবং সম্বন্ধসূচক quantifiers ( ?+, *+, ++, {m,n}+) কখনও কখনও golfing জন্য খুবই উপযোগী। এটি একটি স্ট্রিংয়ের সাথে মেলে এবং পরে ব্যাকট্র্যাকিংয়ের অনুমতি দেয়। সুতরাং এটি কেবল প্রথম ম্যাচিবল স্ট্রিংয়ের সাথে মিলবে যা রেজেক্স ইঞ্জিন দ্বারা পাওয়া গেছে।

উদাহরণস্বরূপ: aশুরুতে বিজোড় সংখ্যার সাথে একটি স্ট্রিং মেলে যা আরও বেশি অনুসরণ করে না a, আপনি এটি ব্যবহার করতে পারেন:

^(aa)*+a
^(?>(aa)*)a

এটি আপনাকে .*নিখরচায় জিনিসগুলি ব্যবহার করতে দেয় এবং যদি একটি সুস্পষ্ট মিল থাকে তবে খুব বেশি বা খুব কম অক্ষরের সাথে মিলে যাওয়ার আরও একটি সম্ভাবনা থাকবে না যা আপনার প্যাটার্নটি ভেঙে দিতে পারে।

। নেট রেজেক্সে (যার অধীনে কোয়ান্টিফায়ার নেই), আপনি এটি গ্রুপ 1 টি সর্বকালের 3 (সর্বোচ্চ 30) বারের (খুব ভালভাবে গল্ফ করেননি) পপ করতে পারেন:

(?>((?<-1>){3}|){10})

1
ইসমাস্ক্রিপ্টে ভোগ্য পরিমাণ বা পারমাণবিক গোষ্ঠীগুলিও অনুপস্থিত রয়েছে :(
সিএস

4

স্যবপ্রেসেশন (পিসিআরই) এর পরে একটি বন্দী গোষ্ঠীটি ভুলে যান

এই রেজেক্সের জন্য:

^((a)(?=\2))(?!\2)

আপনি যদি গ্রুপ 1 এর পরে \ 2 সাফ করতে চান তবে আপনি পুনরাবৃত্তিটি ব্যবহার করতে পারেন:

^((a)(?=\2)){0}(?1)(?!\2)

এটি মিলবে aaযখন আগেরটি এটি করবে না। কখনও কখনও আপনি ব্যবহার করতে পারেন ??বা এমনকি ?জায়গায় {0}

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

এছাড়াও নোট করুন যে পারমাণবিক গ্রুপগুলি পিসিআরইতে পুনরাবৃত্তির জন্য অনুমান করা হয়। সুতরাং এটি একটি অক্ষরের সাথে মেলে না a:

^(a?){0}(?1)a

আমি এটি অন্যান্য স্বাদে এখনও চেষ্টা করে দেখিনি।

লুক হেডসের জন্য, আপনি এই উদ্দেশ্যে ডাবল নেতিবাচক ব্যবহার করতে পারেন:

^(?!(?!(a)(?=\1))).(?!\1)

4

Ptionচ্ছিক অভিব্যক্তি

এটি মনে রাখা কখনও কখনও দরকারী

(abc)?

হয় বেশিরভাগই হিসাবে একই

(abc|)

যদিও একটি সামান্য পার্থক্য আছে: প্রথম ক্ষেত্রে, দলটি ক্যাপচার করে abcবা একেবারে ক্যাপচার করে না। পরবর্তী ঘটনাটি একটি শর্তহীনভাবে একটি ব্যাকগ্রিফেন্সকে ব্যর্থ করে তুলবে। দ্বিতীয় প্রকাশে, গোষ্ঠী হয় হয় ক্যাপচার abcবা একটি খালি স্ট্রিং, যেখানে পরবর্তী ক্ষেত্রেটি একটি শর্তহীনভাবে একটি পশ্চাদপসরণ ম্যাচ করে । এর সাথে পরবর্তী আচরণটি অনুকরণ করতে ?আপনাকে অন্য গ্রুপের সমস্ত কিছু ঘিরে ফেলতে হবে যার জন্য দুটি বাইট লাগবে:

((abc)?)

|আপনি যে কোনও উপায়ে গ্রুপের অন্য কোনও রূপে এক্সপ্রেশনটি মোড়াতে চান এবং ক্যাপচারিংয়ের বিষয়ে চিন্তা করবেন না যখন ব্যবহার করা সংস্করণটিও দরকারী:

(?=(abc)?)
(?=abc|)

(?>(abc)?)
(?>abc|)

অবশেষে, এই কৌশলটি নিখরচায় প্রয়োগ করা যেতে পারে ?যেখানে এটি তার কাঁচা আকারে এমনকি বাইট সংরক্ষণ করে (এবং ফলস্বরূপ 3 টি বাইটগুলি যখন অন্যান্য ফর্মগুলির সাথে মিলিত হয়):

(abc)??
(|abc)

1

সর্বদা মেলে এমন একাধিক লুক হেডস (। নেট)

আপনার কাছে যদি 3 বা ততোধিক লুক হেড কনস্ট্রাক্টস থাকে যা সর্বদা মেলে (subexpressions ক্যাপচার করার জন্য), বা সেখানে অন্য কোনও কিছু অনুসরণকারী লন্ডহেডের কোয়ান্টিফায়ার রয়েছে, সুতরাং সেগুলি অবশ্যই একটি অনিচ্ছাকৃত দলে দলে থাকা উচিত:

(?=a)(?=b)(?=c)
((?=a)b){...}

এগুলি সংক্ষিপ্ত:

(?(?(?(a)b)c))
(?(a)b){...}

যেখানে aকোনও বন্দী গোষ্ঠীর নাম থাকা উচিত নয়। আপনি অন্য জোড়া বন্ধনী যুক্ত |না করে bএবং সাধারণ জিনিসটি বোঝাতে ব্যবহার করতে পারবেন না c

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

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