হ্যান্স, আমি আমার পূর্বের উত্তরটি টোপ এবং গোশত গ্রহণ করব। আপনি বলেছিলেন যে আপনি "আরও কিছু সম্পূর্ণ" চান তাই আমি আশা করি আপনি দীর্ঘ উত্তরটি আপত্তি করবেন না - কেবল খুশি করার চেষ্টা করছেন। কিছু পটভূমি দিয়ে শুরু করা যাক।
প্রথম প্রথম, এটি একটি দুর্দান্ত প্রশ্ন। নির্দিষ্ট প্রসঙ্গে (উদাহরণস্বরূপ, কোনও কোড ব্লকের মধ্যে বা প্রথম বন্ধনীর অভ্যন্তরে) ব্যতীত নির্দিষ্ট নিদর্শনগুলির সাথে ম্যাচ করার প্রশ্ন রয়েছে। এই প্রশ্নগুলি প্রায়শই মোটামুটি বিশ্রী সমাধানের জন্ম দেয়। সুতরাং একাধিক প্রসঙ্গে আপনার প্রশ্ন একটি বিশেষ চ্যালেঞ্জ।
আশ্চর্য
আশ্চর্যের বিষয় হল, কমপক্ষে একটি দক্ষ সমাধান রয়েছে যা সাধারণ, কার্যকর করা সহজ এবং বজায় রাখার জন্য একটি আনন্দ। এটি সমস্ত রেইগেক্স স্বাদের সাথে কাজ করে যা আপনাকে আপনার কোডে ক্যাপচার গ্রুপগুলি পরীক্ষা করতে দেয়। এবং এটি বেশ কয়েকটি সাধারণ প্রশ্নের উত্তর দিতে পারে যা প্রথমে আপনার থেকে পৃথক হতে পারে: "ডোনটস বাদে সমস্ত কিছু মেলে", "সমস্ত প্রতিস্থাপন করুন ...", "আমার মায়ের কালো তালিকায় থাকা সমস্ত শব্দগুলি মিলে", "উপেক্ষা করুন" ট্যাগগুলি "," তাপমাত্রার সাথে তাল মিলানো না থাকলে "...
দুঃখজনকভাবে, কৌশলটি ভালভাবে জানা যায়নি: আমার ধারণা, বিশটি যে প্রশ্নগুলি এটি ব্যবহার করতে পারে, কেবল তার একটিরই উত্তর রয়েছে যার মধ্যে এটি উল্লেখ করা হয়েছে - যার অর্থ পঞ্চাশ বা ষাট উত্তরের মধ্যে একটি হতে পারে। মন্তব্যে কোবির সাথে আমার বিনিময় দেখুন। কৌশলটি এই নিবন্ধটির কিছু গভীরতায় বর্ণিত হয়েছে যা এটিকে (আশাবাদী) "এখনকার সেরা রেজেক্স ট্রিক" বলে। যতটা বিশদে না গিয়ে আমি কৌশলটি কীভাবে কাজ করে তার একটি দৃsp় উপলব্ধি দেওয়ার চেষ্টা করব। বিভিন্ন ভাষায় আরও বিশদ এবং কোডের নমুনার জন্য আমি আপনাকে সেই উত্সটির সাথে পরামর্শ করতে উত্সাহিত করি।
একটি ভাল-পরিচিত বৈচিত্র
পার্ল এবং পিএইচপি সম্পর্কিত নির্দিষ্ট সিনট্যাক্স ব্যবহার করে একটি ভিন্নতা রয়েছে যা একইটি সম্পাদন করে। আপনি এটি ক্যাসিমিরেট হিপপলিট এবং হামজার মতো রেইগেক্স মাস্টারদের হাতে এসওতে দেখতে পাবেন । আমি নীচে এটি সম্পর্কে আপনাকে আরও বলব, তবে আমার এখানে ফোকাস হ'ল সাধারণ সমাধানের দিকে যা সমস্ত রেইগেক্স স্বাদের সাথে কাজ করে (যতক্ষণ আপনি আপনার কোডের ক্যাপচার গোষ্ঠীগুলি পরিদর্শন করতে পারবেন)।
সমস্ত ব্যাকগ্রাউন্ডের জন্য ধন্যবাদ, zx81 ... তবে রেসিপিটি কী?
কী ফ্যাক্ট
পদ্ধতিটি গ্রুপ 1 ক্যাপচারে ম্যাচটি ফিরিয়ে দেয়। সামগ্রিক ম্যাচটি মোটেও পাত্তা দেয় না।
প্রকৃতপক্ষে, কৌশলটি আমরা চাই না এমন বিভিন্ন প্রসঙ্গে মেলে ( |ওআর / বিকল্পটি ব্যবহার করে এই বিষয়গুলিকে শৃঙ্খলাবদ্ধ করা ) যাতে "সেগুলি নিরপেক্ষ করা যায়"। সমস্ত অযাচিত প্রসঙ্গের সাথে মিলে যাওয়ার পরে, বিকল্পটির চূড়ান্ত অংশটি আমরা যা চাই তা মেলে এবং এটি গ্রুপ 1 এ ধারণ করে।
সাধারণ রেসিপিটি হ'ল
Not_this_context|Not_this_either|StayAway|(WhatYouWant)
এটি মিলবে Not_this_context, তবে একটি অর্থে ম্যাচটি একটি আবর্জনা বিনের মধ্যে চলে যায়, কারণ আমরা সামগ্রিক ম্যাচগুলিতে তাকাব না: আমরা কেবল গ্রুপ 1 ক্যাপচারগুলিকে দেখি।
আপনার ক্ষেত্রে, আপনার অঙ্কগুলি এবং আপনার তিনটি বিষয় উপেক্ষা করার জন্য, আমরা এটি করতে পারি:
s1|s2|s3|(\b\d+\b)
নোট করুন যেহেতু আমরা প্রকৃতপক্ষে s1, s2 এবং s3 এর সাথে মিল না করে এগুলি চেহারার সাথে এড়িয়ে চলার চেষ্টা করেছি, এস 1, এস 2 এবং এস 3 এর স্বতন্ত্র প্রকাশগুলি দিনের মতো পরিষ্কার থাকতে পারে। (এগুলির প্রতিটি পক্ষের তারা সুপ্রেসপ্রেশন |)
পুরো প্রকাশটি এইভাবে লেখা যেতে পারে:
(?m)^.*\.$|\([^\)]*\)|if\(.*?//endif|(\b\d+\b)
এই ডেমোটি দেখুন (তবে নীচের ডান প্যানে ক্যাপচার গ্রুপগুলিতে মনোনিবেশ করুন))
যদি আপনি মানসিকভাবে প্রতিটি |ডিলিমিটারে এই রেজেক্সকে বিভক্ত করার চেষ্টা করেন তবে এটি আসলে কেবলমাত্র চারটি সাধারণ অভিব্যক্তির একটি সিরিজ।
ফ্রি-স্পেসিং সমর্থনকারী স্বাদগুলির জন্য, এটি বিশেষত ভাল পড়ে reads
(?mx)
### s1: Match line that ends with a period ###
^.*\.$
| ### OR s2: Match anything between parentheses ###
\([^\)]*\)
| ### OR s3: Match any if(...//endif block ###
if\(.*?//endif
| ### OR capture digits to Group 1 ###
(\b\d+\b)
এটি পড়া এবং বজায় রাখা ব্যতিক্রমী সহজ।
রেজেক্স প্রসারিত হচ্ছে
আপনি যখন আরও পরিস্থিতি s4 এবং s5 উপেক্ষা করতে চান, আপনি এগুলি বাম দিকে আরও বিকল্পে যুক্ত করুন:
s4|s5|s1|s2|s3|(\b\d+\b)
কিভাবে কাজ করে?
আপনি যে বিষয়গুলি চান না তা প্রসঙ্গে বাম দিকে পরিবর্তনের তালিকায় যুক্ত করা হয়েছে: সেগুলি মিলবে, তবে এই সামগ্রিক মিলগুলি কখনই পরীক্ষা করা হয় না, তাই তাদের সাথে মিলানো একটি "আবর্জনার বাক্সে" রাখার একটি উপায়।
আপনি যে সামগ্রীগুলি চান তা অবশ্য গ্রুপ 1 এ ধারণ করা হয়েছে then তারপর আপনাকে প্রোগ্রামগতভাবে চেক করতে হবে যে গ্রুপ 1 সেট করা হয়েছে এবং খালি নেই। এটি একটি তুচ্ছ প্রোগ্রামিংয়ের কাজ (এবং আমরা এটি পরে কীভাবে করব সে সম্পর্কে পরে কথা বলব), বিশেষত বিবেচনা করে যে এটি আপনাকে এমন একটি সাধারণ রেজেক্স দিয়ে ফেলেছে যা আপনি এক নজরে বুঝতে পারবেন এবং প্রয়োজনীয় হিসাবে সংশোধন বা প্রসারিত করতে পারবেন।
আমি সবসময় ভিজ্যুয়ালাইজেশনের ভক্ত নই, তবে পদ্ধতিটি কতটা সহজ তা দেখানোর জন্য এটি একটি ভাল কাজ করে does প্রতিটি "লাইন" একটি সম্ভাব্য ম্যাচের সাথে সামঞ্জস্য করে, তবে কেবল নীচের লাইনটি গ্রুপ 1 এ ধরা পড়ে।

ডিবাগেক্স ডেমো
পার্ল / পিসিআরই ভেরিয়েশন
উপরের সাধারণ সমাধানের বিপরীতে, পার্ল এবং পিসিআরই-এর বিভিন্নতার উপস্থিতি রয়েছে যা প্রায়শই এসও-তে দেখা যায়, কমপক্ষে @ ক্যাসিমায়ারেট হিপোলিটি এবং @ হামজা এর মতো রেইজেক্স গডসের হাতে। এইটা:
(?:s1|s2|s3)(*SKIP)(*F)|whatYouWant
তোমার ক্ষেত্রে:
(?m)(?:^.*\.$|\([^()]*\)|if\(.*?//endif)(*SKIP)(*F)|\b\d+\b
এই প্রকরণটি ব্যবহার করা কিছুটা সহজ কারণ কনটেক্সট এস 1, এস 2 এবং এস 3 এর সাথে মেলে এমন সামগ্রীগুলি সহজেই এড়িয়ে চলেছে, সুতরাং আপনাকে গ্রুপ 1 ক্যাপচারগুলি পরিদর্শন করার প্রয়োজন নেই (লক্ষ্য করুন বন্ধনীগুলি চলে গেছে)। মিলগুলি কেবল থাকেwhatYouWant
নোট করুন (*F), (*FAIL)এবং (?!)সব একই জিনিস। আপনি যদি আরও অস্পষ্ট হতে চান তবে আপনি ব্যবহার করতে পারেন(*SKIP)(?!)
এই সংস্করণের জন্য ডেমো
অ্যাপ্লিকেশন
এখানে কিছু সাধারণ সমস্যা রয়েছে যা এই কৌশলটি প্রায়শই সহজেই সমাধান করতে পারে। আপনি লক্ষ্য করবেন যে শব্দটি পছন্দটি এইগুলির মধ্যে কিছু সমস্যা আলাদা করে তুলতে পারে যখন বাস্তবে এটি কার্যত অভিন্ন।
- আমি কীভাবে কোনও ট্যাগ ছাড়া কোথাও ফু-র সাথে মেলে ধরতে পারি
<a stuff...>...</a>?
- আমি কোনও
<i>ট্যাগ বা জাভাস্ক্রিপ্ট স্নিপেট (আরও শর্তাবলী) বাদে কীভাবে ফু-র সাথে মেলে ফেলতে পারি ?
- এই কালো তালিকায় নেই এমন সমস্ত শব্দের সাথে আমি কীভাবে মিল করব?
- আমি কীভাবে কোনও এস.ই.বি. ... এন্ড.উব ব্লকের ভিতরে কিছু উপেক্ষা করতে পারি?
- ... এস 1 এস 2 এস 3 বাদে আমি কীভাবে সমস্ত কিছু মেলাতে পারি?
গ্রুপ 1 ক্যাপচার প্রোগ্রাম কিভাবে
আপনি কোড হিসাবে করেন নি, তবে সম্পূর্ণ করার জন্য ... গ্রুপ 1 পরিদর্শন করার কোডটি অবশ্যই আপনার পছন্দের ভাষার উপর নির্ভর করবে। যে কোনও হারে এটি ম্যাচে পরিদর্শন করতে আপনি যে কোডটি ব্যবহার করবেন সেটিতে কয়েকটি লাইন যুক্ত করা উচিত নয়।
যদি সন্দেহ হয়, আমি আপনাকে প্রস্তাবিত নিবন্ধটির কোড নমুনা বিভাগটি দেখে নিন যা বেশ কয়েকটি ভাষার কোড উপস্থাপন করে।
বিকল্প
প্রশ্নের জটিলতা এবং ব্যবহৃত রেজেক্স ইঞ্জিনের উপর নির্ভর করে বিভিন্ন বিকল্প রয়েছে। এখানে দুটি রয়েছে যা একাধিক শর্ত সহ বেশিরভাগ পরিস্থিতিতে প্রয়োগ করতে পারে। আমার দৃষ্টিতে, উভয়ই s1|s2|s3|(whatYouWant)রেসিপিটির মতো প্রায় আকর্ষণীয় নয় , কেবল কারণ যদি পরিষ্কারতা সর্বদা জিততে পারে।
1. তারপর প্রতিস্থাপন।
একটি ভাল সমাধান যা হ্যাকি শোনায় তবে অনেক পরিবেশে ভাল কাজ করে তা হল দুটি ধাপে কাজ করা। একটি প্রথম রেজেক্স সম্ভাব্য বিরোধী স্ট্রিংগুলি প্রতিস্থাপন করে আপনি যে প্রসঙ্গটি উপেক্ষা করতে চান তা নিরপেক্ষ করে। আপনি যদি কেবল মিলে যেতে চান, তবে আপনি খালি স্ট্রিং দিয়ে প্রতিস্থাপন করতে পারেন, তারপরে দ্বিতীয় ধাপে আপনার ম্যাচটি চালান। আপনি যদি প্রতিস্থাপন করতে চান, তবে প্রথমে নির্দিষ্ট কিছু প্রস্থের চেইন সহ আপনার অঙ্কগুলি ঘিরে রাখার জন্য, প্রথমে নির্দিষ্ট কিছু দিয়ে উপেক্ষা করার জন্য স্ট্রিংগুলি প্রতিস্থাপন করতে পারেন @@@। এই প্রতিস্থাপনের পরে, আপনি যা চেয়েছিলেন তা প্রতিস্থাপন করতে আপনি মুক্ত, তারপরে আপনাকে আপনার স্বতন্ত্র @@@স্ট্রিংগুলি ফিরিয়ে আনতে হবে ।
2. চেহারা।
আপনার মূল পোস্টটি দেখিয়েছে যে আপনি কীভাবে একরকম শর্তটিকে লুকোয়ারাউন্ডগুলি ব্যবহার করে বাদ দিতে পারবেন তা বোঝে। আপনি বলেছিলেন যে সি # এটির জন্য দুর্দান্ত এবং আপনি ঠিক বলেছেন তবে এটি একমাত্র বিকল্প নয়। সি #, ভিবি.এনইটি এবং ভিজ্যুয়াল সি ++ এ পাওয়া .NET রেজেক্স স্বাদগুলি যেমন পাইথনে regexপ্রতিস্থাপনের জন্য স্থির-পরীক্ষামূলক মডিউল re, কেবলমাত্র দুটি ইঞ্জিনই আমি জানি যে অসীম-প্রস্থের চেহারাটির পিছনে সমর্থন করে। এই সরঞ্জামগুলির সাহায্যে, এক নজর দেখার পিছনে একটি শর্ত কেবল পিছনে নয় ম্যাচ এবং ম্যাচের বাইরেও তাকানোর যত্ন নিতে পারে, লুকেহেডের সাথে সমন্বয়ের প্রয়োজন বর্জন করে। আরও শর্ত? আরও চেহারা।
আপনি সি # তে এস 3 এর জন্য রেজেক্সকে পুনর্ব্যবহার করে পুরো প্যাটার্নটি দেখতে এইরকম হবে।
(?!.*\.)(?<!\([^()]*(?=\d+[^)]*\)))(?<!if\(\D*(?=\d+.*?//endif))\b\d+\b
তবে এতক্ষণে আপনি জানেন যে আমি এটি সুপারিশ করছি না, তাই না?
মুছে দেওয়া
আপনি হাম মুছতে চাইলে @ হামজা এবং @ জেরি পরামর্শ দিয়েছেন যে মামলার জন্য আমি একটি অতিরিক্ত কৌশল সম্পর্কে উল্লেখ করব WhatYouWant। আপনার মনে আছে যে রেসিপিটি ম্যাচ করার WhatYouWant(এটি গ্রুপ 1 এ ক্যাপচার করা) ছিল s1|s2|s3|(WhatYouWant), তাই না? সমস্ত উদাহরণ মুছতে WhatYouWant, আপনি রেজিটাকে এতে পরিবর্তন করেন
(s1|s2|s3)|WhatYouWant
প্রতিস্থাপনের স্ট্রিংয়ের জন্য, আপনি ব্যবহার করুন $1। এখানে যা ঘটে s1|s2|s3তা হ'ল এটির প্রতিটি উদাহরণের সাথে মিলে যায় প্রতিস্থাপনটি $1সেই দৃষ্টান্তটি নিজের সাথে প্রতিস্থাপন করে (রেফারেন্স করে $1)। অন্যদিকে, যখন WhatYouWantমিলে যায়, এটি একটি খালি গোষ্ঠী দ্বারা প্রতিস্থাপন করা হয় এবং অন্য কিছুই - এবং তাই মুছে ফেলা হয়। এই ডেমোটি দেখুন , এই দুর্দান্ত সংযোজনের পরামর্শ দেওয়ার জন্য আপনাকে @ হামজা এবং @ জেরিকে ধন্যবাদ জানাই।
প্রতিস্থাপন
এটি আমাদের প্রতিস্থাপনে নিয়ে আসে, যার উপর আমি সংক্ষেপে স্পর্শ করব।
- কিছুই না দিয়ে প্রতিস্থাপন করার সময়, উপরে "মুছে ফেলা" কৌশলটি দেখুন।
- প্রতিস্থাপন করার সময়, পার্ল বা পিসিআরই ব্যবহার করা হলে
(*SKIP)(*F), আপনি যা চান ঠিক তার সাথে মেলে উপরে বর্ণিত বিভিন্নতাটি ব্যবহার করুন এবং সরাসরি প্রতিস্থাপন করুন।
- অন্যান্য স্বাদে, প্রতিস্থাপন ফাংশন কলের মধ্যে, কলব্যাক বা ল্যাম্বদা ব্যবহার করে ম্যাচটি পরীক্ষা করুন এবং গ্রুপ 1 সেট করা থাকলে প্রতিস্থাপন করুন। যদি আপনার এটির সাহায্যের প্রয়োজন হয় তবে ইতিমধ্যে রেফারেন্স করা নিবন্ধটি আপনাকে বিভিন্ন ভাষায় কোড দেবে।
আনন্দ কর!
না, অপেক্ষা করুন, আরও আছে!
আহ, নাহ, আমি আমার স্মৃতি স্মারকের জন্য এটি পরবর্তী স্প্রিংয়ে প্রকাশ করার জন্য সংরক্ষণ করব।
\Kকোনও বিশেষ পিএইচপি সিনট্যাক্স নয়। আপনি কী বলতে চান দয়া করে বিশদভাবে ব্যাখ্যা করুন। আপনি যদি আমাদের বলার লক্ষ্য রেখে থাকেন যে আপনার কোনও "জটিল" সমাধানের প্রয়োজন নেই তখন আপনাকে বলতে হবে যে আপনার জন্য কী জটিল এবং কেন।