একটি শব্দ / স্ট্রিং বাদ দিতে একটি নিয়মিত প্রকাশ expression


298

আমি নিম্নলিখিত হিসাবে নিয়মিত প্রকাশ করি:

^/[a-z0-9]+$

এই যেমন স্ট্রিং মিলে যায় /helloবা /hello123

যাইহোক, আমি এটা পছন্দ যেমন স্ট্রিং মান দুয়েক বাদ দেওয়ার হবে /ignoremeএবং /ignoreme2

আমি কয়েকটি বৈকল্পিক চেষ্টা করেছি তবে কোনও কাজ করার মতো মনে হচ্ছে না!

আমার সর্বশেষ ব্যর্থ প্রচেষ্টা ছিল

^/(((?!ignoreme)|(?!ignoreme2))[a-z0-9])+$

কোনও সহায়তা কৃতজ্ঞভাবে প্রশংসা করা হবে :-)


উত্তর:


376

এখানে আরও একটি উপায় রয়েছে ( নেতিবাচক চেহারা ব্যবহার করে ):

^/(?!ignoreme|ignoreme2|ignoremeN)([a-z0-9]+)$ 

দ্রষ্টব্য: শুধুমাত্র এক ক্যাপচারিং অভিব্যক্তি আছে: ([a-z0-9]+)


1
উজ্জ্বল, এটি কৌশলটি করেছে বলে মনে হয়। ইউআরএল পুনর্লিখনের জন্য আমার আসলে এই বিধিটি প্রয়োজন এবং আমি "চিত্রগুলি", "সিএসএস" এবং "জেএস" ফোল্ডারটি উপেক্ষা করতে চেয়েছিলাম। সুতরাং আমার নিয়মটি নিম্নরূপ: ^ / ((?! সিএসএস | জেএস | চিত্রসমূহ) ([এজেড] +) /? (\? (। +))? It এবং এটি / প্রোফাইলে.এএসপিএক্স? Id=$1& to3 এ পুনর্লিখন করে? এই নিয়মটি কি সঠিকভাবে কাজ করবে এবং কোয়েরি স্ট্রিংটি প্রচার করবে? সুতরাং কেউ যদি mydomain.com/hello?abc=123 এ যান তবে আমি চাই যে এটি আমার পুনরায় লিখতে চাই mydomain.com/Profile.aspx?id=hello&abc=123 এ আমি (। +) এর কার্যকারিতা সম্পর্কেও কিছুটা অনিশ্চিত ure মূল অনুরোধে ক্যোরিস্ট্রিং ক্যাপচার করার শেষ।
রোমিমে

এই মত শব্দ অন্য প্রশ্ন। আপনি দেখতে পেয়েছেন এমন regexp এটি ক্যোয়ারী স্ট্রিং - পরীক্ষাটি ক্যাপচার করবে এবং দেখুন যে আপনার ক্যোয়ারী স্ট্রিংটি বরাবর আসে কিনা। এছাড়াও - (\?(.+))?$দ্রুত হওয়া উচিত। আমি গতি নিয়ে খুব বেশি চিন্তা করব না।
শেঠ

1
এটি আমার পক্ষে কার্যকর হয়নি, যখন অ্যালিক্স অ্যাক্সেলের সমাধান কাজ করেছিল। আমি জাভা java.util.regex.Patternক্লাস ব্যবহার করছি ।
মার্ক জেরোনিমাস

1
আমি মার্কের রিমার্কটি নিশ্চিত করি;) - উদাহরণস্বরূপ, পাইচার্ম জাভা ভিত্তিক, তাই না? সুতরাং, পাইচার্ম অনুসন্ধানে রেজিক্সগুলি বিবেচনা করে অ্যালিক্সের সমাধান কাজ করে, অন্যটি তা করে না।
fanny

43

এটি করা উচিত:

^/\b([a-z0-9]+)\b(?<!ignoreme|ignoreme2|ignoreme3)

আপনি নিজের পছন্দ মতো উপেক্ষিত শব্দ যুক্ত করতে পারেন, এখানে একটি সাধারণ পিএইচপি বাস্তবায়ন:

$ignoredWords = array('ignoreme', 'ignoreme2', 'ignoreme...');

preg_match('~^/\b([a-z0-9]+)\b(?<!' . implode('|', array_map('preg_quote', $ignoredWords)) . ')~i', $string);

আমি ভেবেছিলাম পিছনে পিছনে একটি নির্দিষ্ট-প্রস্থের ধরণ প্রয়োজন?
সাইমন

2
@ অ্যালেক্সএক্সেল এটি করে, তবে স্মার্ট রিজেক্স লিবগুলি বিকল্পগুলির জন্য বিভিন্ন দৈর্ঘ্যের (এবং দীর্ঘতম ব্যবহারের জন্য) পরিবর্তনের অনুমতি দেবে, যতক্ষণ না প্রতিটি বিকল্প নির্দিষ্ট দৈর্ঘ্যের হয়।
ChrisF

এটি স্মার্ট, তবে উপেক্ষিত শব্দটি অন্য কোনও শব্দের শেষে থাকলে আমার পক্ষে ব্যর্থ। উদাহরণস্বরূপ, আপনি যদি উপেক্ষা করা শব্দের এক হিসাবে 'a' যুক্ত করেন, তবে এর মধ্যে যে কোনও শব্দ শেষ হয় তা এড়ানো হবে
সিঙ্গমোটর

21

আপনি উভয় শব্দ বাদ দিতে চাইলে আপনার একটি ধারণা প্রয়োজন:

^/(?!ignoreme$)(?!ignoreme2$)[a-z0-9]+$

এখন উভয় শর্তটি অবশ্যই ম্যাচের জন্য সত্য ( উপেক্ষা বা উপেক্ষা 2 অনুমোদিত নয়) হওয়া উচিত।


1
এটি উপরের সংক্ষিপ্তটির সমান যা বিকল্পের সেটগুলির নেতিবাচক চেহারা।
ChrisF

4
পছন্দ করেছেন শেঠ এর সমাধান ভালো কিছু মেলে না /ignoremenotযেমন /দ্বারা অনুসরণ করা হয় ignoreme
গম্বো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.