কিভাবে পুরো রেজেক্স অবহেলা করবেন?


97

উদাহরণস্বরূপ আমার একটি রেজেক্স রয়েছে (ma|(t){1})। এটি মেলে maএবং tমিলছে না bla

আমি Regex অস্বীকার করা, সুতরাং এটা মেলানো চান blaএবং maএবং t, এই Regex কিছু যোগ করে । আমি জানি আমি লিখতে পারি bla, আসল রেজেক্স তবে আরও জটিল।


4
একদিকে {1}যেমন সম্পূর্ণ অকেজো। (আপনি যদি মনে করেন এটির কোনও মূল্য সরবরাহ করা হয় তবে আপনি কেন লিখেন না ((m{1}a{1}){1}|(t){1}){1}?)
ট্রিপলি

উত্তর:


102

নেতিবাচক চেহারা দেখতে ব্যবহার করুন: (?!pattern)

ইতিবাচক দর্শনগুলি কোনও প্যাটার্নের সাথে মেলে তা জোর দিয়ে ব্যবহার করা যেতে পারে। নেতিবাচক চেহারাগুলি বিপরীত: এটি একটি প্যাটার্নটি মেলে না তা জোর দিয়ে ব্যবহৃত হয় used কিছু গন্ধ দৃser় সমর্থন; কিছু লুকবাইন্ড ইত্যাদি সীমাবদ্ধতা রাখে।

নিয়মিত- এক্সপ্রেসন.ইনফোর লিঙ্ক

আরো দেখুন

আরও উদাহরণ

এগুলি খেলনা সমস্যাগুলির রেজিেক্স সমাধানগুলি ব্যায়াম হিসাবে গ্রহণ করার চেষ্টা করা হয়; আপনি যদি বিভিন্নভাবে নজরকাড়া ব্যবহার করতে পারেন (বাসা বেঁধে রাখছেন, সেগুলি ধরার জন্য ব্যবহার করছেন ইত্যাদি) বিভিন্নভাবে শেখার চেষ্টা করছেন তবে তাদের শিক্ষাগত হওয়া উচিত:


4
নিয়মিত-expressions.info হ'ল সমস্ত জিনিসকে পুনরায় সাজানোর জন্য খুব ভাল উত্স।
ফ্রেইইট

সকলের চাক্ষুষ সমর্থন কি? সঙ্গে কাজ করে না grep
Lazer

Pattern.compile("(?!(a.*b))").matcher("xab").matches()হওয়া উচিত true, ঠিক?
কার্ল রিখটার

4
আমি এটি ঠিক না বলে মনে করি, একটি সঠিক বিকল্পের জন্য stackoverflow.com/questions/8610743/… দেখুন ।
কার্ল রিখটার

57

ধরে নিই যে আপনি কেবল রেজেক্সের সাথে মেলে এমন স্ট্রিংগুলিকেই বাতিল করতে চান (অর্থাত্ mmblaঠিক আছে, তবে mmতা নয়), আপনি যা চান তা এই:

^(?!(?:m{2}|t)$).*$

(?!(?:m{2}|t)$)একটি নেতিবাচক চেহারা ; এটিতে "বর্তমান অবস্থান থেকে শুরু করে, পরবর্তী কয়েকটি অক্ষর স্ট্রিংয়ের শেষে হয় না mm বা tহয়"। ^শুরুতে স্টার্ট অ্যাঙ্কর ( ) নিশ্চিত করে যে স্ট্রিংয়ের শুরুতে লুকোহেড প্রয়োগ করা হয়েছে। যদি এটি সফল হয়, .*এগিয়ে যায় এবং স্ট্রিং গ্রাস করে।

এফওয়াইআই, আপনি যদি জাভা matches()পদ্ধতি ব্যবহার করেন তবে আপনার সত্যিকারের ^ফাইনাল এবং ফাইনালের দরকার নেই $তবে তারা কোনও ক্ষতি করবেন না। $ভিতরে lookahead প্রয়োজন, যদিও করা হয়।


4
এই উত্তরের সর্বাধিক সহায়ক অংশটি হ'ল আপনাকে .*আপনার রেজেক্সের শেষে যুক্ত করতে হবে, অন্যথায় এটি প্রতিটি স্ট্রিংকে প্রত্যাখ্যান করবে।
রাব

4
$ ভিতরে নেতিবাচক lookahead, এবং .*শেষে উভয় সমালোচনামূলক বিট। আরইএস এর মতো সর্বদা, ইউনিট পরীক্ষার একটি শক্তিশালী সেট এটি সঠিকভাবে অর্জনের জন্য একেবারে সমালোচিত। এই উত্তরটি 100% সঠিক।
টম ডিবল

1
\b(?=\w)(?!(ma|(t){1}))\b(\w*)

এটি প্রদত্ত রেজেক্সের জন্য।
\ বি শব্দের সীমানা সন্ধান করা।
ইতিবাচক চেহারা এগিয়ে (? = \ ডাব্লু) ফাঁকা স্থান এড়াতে এখানে।
আসল রেজেক্সের চেয়ে এগিয়ে নেতিবাচক চেহারা এর মিলগুলি প্রতিরোধ করা।
এবং অবশেষে (\ ডাব্লু *) হ'ল বাকী সমস্ত শব্দটি ধরা।
যে গ্রুপটি এই শব্দগুলিকে ধরে রাখবে সে গ্রুপটি ৩.
সাধারণ (?! প্যাটার্ন) কোনও উপ-স্ট্রিং
সাধারণ match (?! (?! (?: m {2} | t) $) match) এর সাথে মিলবে বলে কাজ করবে না *) গ্রানুলারিটি পুরো লাইন হিসাবে কাজ করে না


0

আপনি যদি লারাভেল ব্যবহার করেন তবে এটি প্রয়োগ করুন।

লারাভেলের একটি not_regex রয়েছে যেখানে বৈধতার অধীনে ক্ষেত্র অবশ্যই প্রদত্ত নিয়মিত প্রকাশের সাথে মেলে না; preg_matchঅভ্যন্তরীণভাবে পিএইচপি ফাংশন ব্যবহার করে ।

'email' => 'not_regex:/^.+$/i'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.