আপনি কি একটি রেজেক্স কেস-সংবেদনশীলের কেবল একটি অংশ বানাতে পারেন?


102

সম্পূর্ণ নিয়মিত প্রকাশকে কেস-সংবেদনশীল করার অনেক উদাহরণ আমি দেখেছি। আমি যা ভাবছি তা হল অভিব্যক্তির কেবলমাত্র অংশটি কেস-সংবেদনশীল হওয়া।

উদাহরণস্বরূপ, ধরা যাক আমার এর মতো স্ট্রিং রয়েছে:

fooFOOfOoFoOBARBARbarbarbAr

আমি যদি কেস নির্বিশেষে "foo" এর সমস্ত ঘটনার সাথে মিল রাখতে চাই তবে আমি কেবল ওপরের ক্ষেত্রে "বার" এর সাথে মেলাতে চাই?

আদর্শ সমাধানটি এমন কিছু হবে যা রিজেক্স স্বাদগুলি জুড়ে কাজ করে তবে আমি ভাষা-নির্দিষ্ট কিছু শুনতে আগ্রহী (ধন্যবাদ এস্পো )

সম্পাদনা করুন

সরবরাহ লিঙ্কটি খুব সহায়ক ছিল। এক্সপ্রেশনটির মধ্যে পরিবর্তনগুলি চালু এবং বন্ধ করার বিষয়ে একটি ভাল উদাহরণ রয়েছে।

আমার স্বীকৃত উদাহরণের জন্য, আমি এরকম কিছু করতে পারি:

(?i)foo*(?-i)|BAR

যা ম্যাচের কেবলমাত্র অংশের জন্য ম্যাচ কেস-সংবেদনশীল করে তোলে।

এটি জাভাস্ক্রিপ্ট, পাইথন এবং আরও কয়েকজন (এস্পোর বর্ণিত হিসাবে) ব্যতীত বেশিরভাগ রেজেক্স বাস্তবায়নে কাজ করে বলে মনে হয়েছিল।

যে বড়গুলি সম্পর্কে আমি ভাবছিলাম (পার্ল, পিএইচপি,। নেট) সমস্ত ইনলাইন মোড পরিবর্তন সমর্থন করে।


এই প্রশ্নটি "মোডিফায়ার্স" এর অধীনে স্ট্যাক ওভারফ্লো নিয়মিত এক্সপ্রেশন FAQ এ যুক্ত করা হয়েছে ।
aliteralmind

উত্তর:


88

পার্ল আপনাকে (? আমি :) প্যাটার্ন সংশোধক ব্যবহার করে আপনার নিয়মিত প্রকাশের কেস-সংবেদনশীল অংশ তৈরি করতে দেয়।

আধুনিক রেজেক্স স্বাদগুলি আপনাকে নিয়মিত অভিব্যক্তির কেবলমাত্র অংশে মডিফায়ার প্রয়োগ করতে দেয়। আপনি যদি রেইগেক্সের মাঝখানে সংশোধক (? আইএসএম) sertোকান তবে সংশোধকটি কেবলমাত্র সংশোধনকারীটির ডানদিকে রেজেক্সের অংশে প্রযোজ্য। আপনি মোডগুলি বিয়োগ চিহ্ন সহ পূর্ববর্তী করে বন্ধ করতে পারেন। বিয়োগ চিহ্নের পরে সমস্ত মোড বন্ধ হয়ে যাবে। উদাহরণস্বরূপ (? I-sm) ক্ষেত্রে সংবেদনশীলতা চালু করে এবং একক-লাইন মোড এবং মাল্টি-লাইন মোড উভয়ই বন্ধ করে দেয়।

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

আপনি কীভাবে রেগেক্স গন্ধটি হ্যান্ডেল মোড সংশোধক ব্যবহার করছেন তা দ্রুত পরীক্ষা করতে পারেন। রেজেক্স (? I) তে (? - i) স্ট্যান্ডের পরীক্ষা এবং টেস্টের সাথে মিল থাকা উচিত, তবে টেস্ট বা টেস্ট নয়।

সূত্র


6

আপনি কোন ভাষা ব্যবহার করছেন? এটি করার একটি স্ট্যান্ডার্ড উপায় হ'ল / ([এফএফ] [ওও] {2} | বার) / কেস সংবেদনশীলতা সহ কিছু হবে তবে জাভাতে উদাহরণস্বরূপ, একটি কেস সংবেদনশীলতা সংশোধক (? I) রয়েছে যা সমস্ত কিছু তৈরি করে এর ডানদিকে অক্ষরগুলি সংবেদনশীল এবং (? -i) কে সংবেদনশীলতা জোর করে। জাভা রেজেেক্স সংশোধকটির একটি উদাহরণ এখানে পাওয়া যাবে


+1 আপনি উভয় মামলার সাথে মিল
রাখতে পারলে

12
@ নোনাউরবিজ: কারণ মত প্রকাশের (?i)foobarচেয়ে বেশি পাঠযোগ্য[Ff][Oo]{2}[Bb][Aa][Rr]
থানাটোস

4
এবং এটি হত্তয়া করতে পারবেন না কারণ উপায় আরো অনেক কিছু লোমশ এবং জটিল।
চপ

6

দুর্ভাগ্যক্রমে কেস-সংবেদনশীল মিলের জন্য সিনট্যাক্সটি সাধারণ নয়। .NET এ আপনি RegexOptions.IgnoreCase পতাকা বা ? আমি সংশোধক ব্যবহার করতে পারেন


5

এটি সত্য যে নিয়মিত এক্সপ্রেশনটির কেবলমাত্র অংশের জন্য টার্নিং মোডগুলি চালু এবং বন্ধে বর্ণিত ইনলাইন পরিবর্তকদের উপর নির্ভর করতে পারে :

রেজেক্স (?i)te(?-i)stপরীক্ষার সাথে মিলবে এবং TEstতবে নয় teSTবা TEST

তবে কিছুটা বেশি সমর্থিত বৈশিষ্ট্য হ'ল একটি (?i:...)ইনলাইন মডিফায়ার গ্রুপ ( Modifier Spans দেখুন )। সিনট্যাক্সটি হল (?i:, তারপরে আপনি যে প্যাটার্নটি ক্যাস-সংবেদনশীল করতে চান এবং তারপরে একটি )

(?i:foo)|BAR

বিপরীত : আপনার প্যাটার্ন একটি মামলা অবশ বিকল্প কম্পাইল করা হয় এবং আপনি একটি Regex ক্ষেত্রে একটি অংশ সংবেদনশীল করতে প্রয়োজন হয়, তাহলে আপনি যোগ -পর ?: (?-i:...)

উদাহরণ বিভিন্ন ভাষায় ব্যবহার করে (কোণ বন্ধনী দিয়ে ম্যাচ মোড়ানো):

সমর্থিত নয় , , , std::regex, ,


এটি bash"পার্ল-জাতীয়" রেজেস ব্যবহার করা থাকলে এটি সমর্থিত । চেষ্টা করুন:echo BAR | grep -P '(?i)bar'
নোয়াম মানস

@ নোমমনোস এটি খাঁটি বাশ নয় grep, এটি ইতিমধ্যে পিসিআরই সম্পর্কিত, যা পার্ল-সামঞ্জস্যপূর্ণ নিয়মিত অভিব্যক্তি গ্রন্থাগার, তাই এটি ইতিমধ্যে আচ্ছাদিত perl। যেমনটি আপনি দেখতে পাচ্ছেন, আমি grepএখানে তালিকা তৈরি করিনি , যেহেতু grep -Pবিকল্পটি সর্বজনীনভাবে সমর্থিত নয় (এটি কেবল জিএনইউ দ্বারা সমর্থিত grep)
উইক্টর স্ট্রিবিউউ

4

আপনি ব্যবহার করতে পারেন

(?:F|f)(?:O|o)(?:O|o)

?: বন্ধনীগুলিতে। নেট মানে এটি ক্যাপচার নয়, এবং কেবলমাত্র | এর শর্তাদি গোষ্ঠীভুক্ত করার জন্য ব্যবহৃত হয়েছিল (বা) বিবৃতি।


27
"[এফএফ] [ওও] [ওও]" কি এর চেয়ে ভাল বিকল্প নয়? উদাহরণ স্বরূপ আপনি এমনকি "[এফএফ] [ওও] \ {2}" ;-) পর্যন্ত যেতে পারেন
টমলাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.