কোনও শব্দ নেই এমন একটি লাইনের সাথে মেলে নিয়মিত প্রকাশ


4292

আমি জানি যে কোনও শব্দের সাথে মিল পাওয়া সম্ভব এবং তারপরে অন্যান্য সরঞ্জামগুলি (উদাহরণস্বরূপ grep -v) ব্যবহার করে ম্যাচগুলিকে বিপরীত করুন । যাইহোক, hedeনিয়মিত অভিব্যক্তি ব্যবহার করে , যেমন একটি নির্দিষ্ট শব্দ থাকে না এমন লাইনগুলি কি মিলানো সম্ভব ?

ইনপুট:

hoho
hihi
haha
hede

কোড:

grep "<Regex for 'doesn't contain hede'>" input

পছন্দসই আউটপুট:

hoho
hihi
haha

84
সম্ভবত কয়েক বছর দেরী হয়েছে, তবে এতে কী দোষ হয়েছে ([^h]*(h([^e]|$)|he([^d]|$)|hed([^e]|$)))*:? ধারণাটি সহজ। আপনি অযাচিত স্ট্রিংয়ের সূচনা না হওয়া পর্যন্ত মেলাতে থাকুন, তারপরে কেবল N-1 ক্ষেত্রে মেলে যেখানে স্ট্রিংটি অসম্পূর্ণ (যেখানে এন স্ট্রিংটির দৈর্ঘ্য)। এই এন -1 কেসগুলি হ'ল "এইচ-এর পরে নন-ই", "তিনি নন-ডি অনুসরণ করেন" এবং "হেডের পরে নন-ই"। যদি এইসব এন -1 মামলা পাস পরিচালিত, আপনি সফলভাবে করা হয়নি অবাঞ্ছিত স্ট্রিং মেলে তাই আপনি এ খুঁজছেন শুরু করতে পারেন [^h]*আবার
stevendesu

323
@ স্টেভেনডেসু: 'খুব-দীর্ঘ-দীর্ঘ শব্দ' বা আরও অর্ধেক বাক্যের জন্য এটি ব্যবহার করে দেখুন। মজা টাইপ করুন। বিটিডাব্লু, এটি প্রায় অপঠনযোগ্য। পারফরম্যান্স প্রভাব সম্পর্কে জানেন না।
পিটার শোয়েজ

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

57
@ স্টেভেনডেসু: আমি আরও পরে এসেছি, কিন্তু এই উত্তরটি প্রায় সম্পূর্ণ ভুল। একটি জিনিসের জন্য, এটিতে "এইচ" ধারণ করার বিষয়টির প্রয়োজন যা এটি করা উচিত নয়, টাস্কটি দেওয়া হচ্ছে "ম্যাচ লাইনগুলিতে [কোনও] নির্দিষ্ট শব্দটি নেই" given আসুন আমরা ধরে নিই যে আপনি অভ্যন্তরীণ গোষ্ঠীকে ^([^h]*(h([^e]|$)|he([^d]|$)|hed([^e]|$))?)*$ alচ্ছিক করতে চেয়েছিলেন, এবং সেই প্যাটার্নটি নোঙ্গর করা হয়েছে: "হেইড" এর আংশিক উদাহরণ যেমন "হেহেড" এর আগে "হেইড" এর উদাহরণ থাকে তখন এটি ব্যর্থ হয়।
জয়তেয়া

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

উত্তর:


5890

রিজেক্স বিপরীতমুখী ম্যাচ সমর্থন করে না এমন ধারণা সম্পূর্ণ সত্য নয়। নেতিবাচক চেহারা ব্যবহার করে আপনি এই আচরণটি নকল করতে পারেন:

^((?!hede).)*$

Regex উপরে একটি লাইন বিরতি ছাড়াই যেকোনো স্ট্রিং, বা লাইন ম্যাচ হবে, না (SUB) টিতে 'Hede' রয়েছে। যেমনটি উল্লেখ করা হয়েছে, এটি (বা করা উচিত) এ রেজেক্স "ভাল" এমন কিছু নয় তবে এখনও, এটি সম্ভব is

এবং যদি আপনার পাশাপাশি লাইন ব্রেক চরগুলিও মেলে প্রয়োজন হয়, তবে ডট-অল সব সংশোধক ( sনিম্নলিখিত প্যাটার্নের পিছনে ) ব্যবহার করুন:

/^((?!hede).)*$/s

অথবা এটি ইনলাইন ব্যবহার করুন:

/(?s)^((?!hede).)*$/

(যেখানে /.../রেজেক্স ডিলিমিটারগুলি, অর্থাত্ প্যাটার্নের অংশ নয়)

যদি ডট-অল সব সংশোধক উপলব্ধ না হয়, আপনি অক্ষর শ্রেণীর সাথে একই আচরণ নকল করতে পারেন [\s\S]:

/^((?!hede)[\s\S])*$/

ব্যাখ্যা

একটি স্ট্রিং কেবলমাত্র nঅক্ষরের একটি তালিকা । প্রতিটি অক্ষরের আগে এবং পরে, একটি খালি স্ট্রিং রয়েছে। সুতরাং nঅক্ষরের তালিকায় n+1ফাঁকা স্ট্রিং থাকবে। স্ট্রিংটি বিবেচনা করুন "ABhedeCD":

    ┌──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┐
S = e1 A e2 B e3 h e4 e e5 d e6 e e7 C e8 D e9
    └──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┘

index    0      1      2      3      4      5      6      7

যেখানে eখালি স্ট্রিং। রেজেক্সটি (?!hede).সামনে কোনও স্ট্রিংগুলি "hede"দেখার দরকার নেই কিনা তা দেখার জন্য অপেক্ষা করে , এবং যদি এটি হয় (সুতরাং অন্য কোনও কিছু দেখা যায়), তবে .(বিন্দু) একটি লাইন বিরতি ব্যতীত অন্য কোনও চরিত্রের সাথে মিলবে। আশেপাশের স্থানগুলিকে শূন্য-প্রস্থ -অনুসারগুলিও বলা হয় কারণ তারা কোনও অক্ষর গ্রাস করে না । তারা কেবল কিছু দৃsert়তা / বৈধতা দেয়।

সুতরাং, আমার উদাহরণে, প্রতিটি খালি স্ট্রিং প্রথমে যাচাই করা হয় কিনা "hede"আগে কোনও অক্ষর .(বিন্দু) দ্বারা গ্রাস করার আগে সামনে নেই কিনা to Regex (?!hede).তা করতে হবে শুধুমাত্র একবার, তাই এটি একটি গ্রুপ আবৃত করা হয়, এবং পুনরাবৃত্তি শূন্য বা তার বেশি বার: ((?!hede).)*। পরিশেষে, পুরো ইনপুটটি গ্রাস হয়ে গেছে তা নিশ্চিত করার জন্য ইনপুটটি শুরু এবং শেষ হওয়াটি নোঙ্গর করা হয়:^((?!hede).)*$

আপনি দেখতে পাচ্ছেন, ইনপুটটি "ABhedeCD"ব্যর্থ হবে কারণ e3, রেজেক্স (?!hede)ব্যর্থ হয় (সেখানে হয় "hede" এগিয়ে আপ!)।


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

29
কঠোরভাবে নেতিবাচক লুওক-ফরোডে কথা বলা আপনাকে নিয়মিত প্রকাশকে নিয়মিত নয়।
পিটার কে

55
@ পিটারক নিশ্চিত, তবে এটি ম্যাথওভারফ্লো বা সিএস-স্ট্যাকেক্সচেঞ্জ নয় S এখানে একটি প্রশ্ন জিজ্ঞাসা করা লোকেরা সাধারণত ব্যবহারিক উত্তর খুঁজছেন। grepরিজেক্স-সাপোর্ট সহ বেশিরভাগ লাইব্রেরি বা সরঞ্জাম (যেমন ওপি উল্লেখ করেছেন) সমস্তগুলিতে এমন বৈশিষ্ট্য রয়েছে যা তাদের তাত্ত্বিক দিক থেকে নিয়মিত করে না m
বার্ট কায়ার্স

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


738

দ্রষ্টব্য যে সমাধানটি "হেড" দিয়ে শুরু হয় না :

^(?!hede).*$

সাধারণত অনেক সমাধান অধিক কার্যকরী হয় না থাকে "Hede" :

^((?!hede).)*$

প্রাক্তন চেকগুলি প্রতিটি অবস্থানের পরিবর্তে কেবল ইনপুট স্ট্রিংয়ের প্রথম অবস্থানে থাকে he


5
ধন্যবাদ, আমি এটি যাচাই করতে ব্যবহার করেছি যে স্ট্রিংয়ে অঙ্কের স্কোয়েন্স (^ (?! \ D {5,}) থাকে না।) *
সামিহ এ

2
হ্যালো! আমি রচনা করতে পারি না "হেড" রেজেক্সের সাথে শেষ হয় না । আপনি এটি সাহায্য করতে পারেন?
ইলেকস ইয়া

1
@ আলেকসইয়া: কেবল "অন্তর্ভুক্ত" সংস্করণটি ব্যবহার করুন, এবং অনুসন্ধানের স্ট্রিংয়ের প্রান্তের অ্যাঙ্করটিকে অন্তর্ভুক্ত করুন: "হেড" থেকে "হ্যাড" "স্ট্রিংটিকে" মেলে না "হিসাবে পরিবর্তন করুন
নায়ারগডস

2
@AleksYa: শেষ হয় না সংস্করণের নেতিবাচক lookbehind ব্যবহার করা যেতে পারে: (.*)(?<!hede)$। @ নায়ারগডস সংস্করণটি পাশাপাশি কাজ করবে তবে উত্তরটির উল্লেখ করা পারফরম্যান্সের বিষয়টিটি পুরোপুরি মিস করে।
thisismydesign

5
এত উত্তর কেন বলছে ^((?!hede).)*$? এটি ব্যবহার করা আরও দক্ষ না ^(?!.*hede).*$? এটি একই জিনিসটি করে তবে কয়েকটি পদক্ষেপে
জ্যাকপ্রেড

208

আপনি যদি এটি কেবল গ্রেপের জন্য ব্যবহার করেন তবে আপনি এটি ব্যবহার করতে পারেনgrep -v hede সমস্ত লাইন যাতে হিড থাকে না।

ইটিএ ওহ, প্রশ্নটি পুনরায় পড়া, grep -vসম্ভবত আপনি "সরঞ্জাম বিকল্পগুলি" দ্বারা বোঝাচ্ছেন।


22
টিপ: আপনি যা চান না ক্রমান্বয়ে ফিল্টার করার জন্য: গ্রেপ-ভি "হেড" | grep -v "হাইহি" | ... ইত্যাদি।
অলিভিয়ার লালনদে

51
বা শুধুমাত্র একটি প্রক্রিয়া ব্যবহার করেgrep -v -e hede -e hihi -e ...
ওলাফ ডিয়েটশে

15
বা কেবল grep -v "hede\|hihi":)
পুতিনিক

2
আপনার যদি অনেকগুলি নিদর্শন থাকে যা আপনি ফিল্টার করতে চান, সেগুলি একটি ফাইলে রাখুন এবং ব্যবহার করুনgrep -vf pattern_file file
কোডফোরস্টার

4
বা সহজভাবে egrepবা grep -Ev "hede|hihi|etc"বিশ্রী পালানো এড়াতে।
অমিত নাইডু

159

উত্তর:

^((?!hede).)*$

ব্যাখ্যা:

^স্ট্রিংয়ের শুরু, (গোষ্ঠী এবং ক্যাপচার করুন \ 1 (0 বা তার বেশি বার (সম্ভাব্য সর্বাধিক পরিমাণের সাথে মিলছে)),
(?!সেখানে নেই কিনা তা দেখার জন্য অপেক্ষা করুন,

hede আপনার স্ট্রিং,

)নজরুলের সমাপ্তি, .character n ব্যতীত অন্য কোনও অক্ষর
)*, \ 1 এর সমাপ্তি (দ্রষ্টব্য: কারণ আপনি এই ক্যাপচারে কোয়ান্টিফায়ার ব্যবহার করছেন, কেবলমাত্র ক্যাপচার করা প্যাটার্নটির সর্বশেষ পুনরাবৃত্তি in 1 এ সংরক্ষণ করা হবে)
$, n, এবং স্ট্রিং এর শেষ


14
দুর্দান্ত যে একাধিক শব্দ ব্যবহার করে সূক্ষ্ম পাঠ 2 এ আমার জন্য কাজ করেছে^((?!DSAU_PW8882WEB2|DSAU_PW8884WEB2|DSAU_PW8884WEB).)*$
দামোদর বাশিয়াল

3
@ দামোদরবাশিয়াল আমি জানি আমি এখানে বেশ দেরি করেছি, তবে আপনি সেখানে দ্বিতীয় মেয়াদটি পুরোপুরি সরিয়ে ফেলতে পারেন এবং ঠিক একই ফলাফল পাবেন
forresthopkinsa

99

প্রদত্ত উত্তরগুলি পুরোপুরি ঠিক আছে, কেবলমাত্র একাডেমিক পয়েন্ট:

তাত্ত্বিক কম্পিউটার বিজ্ঞানের অর্থের নিয়মিত অভিব্যক্তি এটি এ জাতীয়ভাবে সক্ষম নয় । তাদের জন্য এটির মতো কিছু দেখতে হবে:

^([^h].*$)|(h([^e].*$|$))|(he([^h].*$|$))|(heh([^e].*$|$))|(hehe.+$) 

এটি কেবল পুরো ম্যাচটি করে। উপ-ম্যাচের জন্য এটি করা আরও বিশ্রী হবে।


1
এটি লক্ষণীয় গুরুত্বপূর্ণ যে এটি কেবলমাত্র বেসিক POSIX.2 নিয়মিত এক্সপ্রেশন ব্যবহার করে এবং সুতরাং যখন পিসিআরই উপলব্ধ না থাকে তখন তার জন্য আরও বেশি পোর্টেবল হয়।
স্টিভ-ও

5
আমি রাজী. সর্বাধিক নিয়মিত প্রকাশ না থাকলে অনেকেই নিয়মিত ভাষা না হন এবং একটি সীমাবদ্ধ অটোমেটা দ্বারা স্বীকৃত হতে পারে না।
টমাসম্যাকলয়েড

@ThomasMcLeod, Hades32: বলতে 'পাবে কোন সম্ভাব্য নিয়মিত ভাষার রাজ্য মধ্যে এটি কি না ' এবং ' এবং ' সেইসাথে ' বা ' একটি মত প্রকাশের যেমন ' (hede|Hihi)'? (এটি সিএসের জন্য একটি প্রশ্ন হতে পারে))
জেমস হাই

7
@ জন অ্যালেন: এমই !!! … আচ্ছা, আসল রেজেক্স নয়, একাডেমিক রেফারেন্স, যা গণনার জটিলতার সাথেও নিবিড়ভাবে সম্পর্কিত; মূলত পিসিআরই POSIX নিয়মিত এক্সপ্রেশন হিসাবে একই দক্ষতার গ্যারান্টি দিতে পারে না।
জেমস হাইগ

4
দুঃখিত - এই উত্তরটি ঠিক কাজ করে না, এটি মিলবে এবং এমনকি আংশিকভাবে মিলবে (দ্বিতীয়ার্ধে)
ফ্যালকো

60

আপনি Regex পরীক্ষা করতে চান, শুধুমাত্র যদি ব্যর্থ সমগ্র স্ট্রিং ম্যাচ, নিম্নলিখিত কাজ করবে:

^(?!hede$).*

উদাহরণস্বরূপ - আপনি যদি "foo" (যেমন "ফুফু", "বারফু" এবং "foobar" ব্যতীত সমস্ত মানকে অনুমতি দিতে চান তবে "foo" ব্যর্থ হবে) ব্যবহার করুন: ^(?!foo$).*

অবশ্যই, আপনি যদি সঠিক সাম্যতার জন্য যাচাই করেন, তবে স্ট্রিং সমতা পরীক্ষা করার জন্য এই ক্ষেত্রে আরও ভাল একটি সাধারণ সমাধান

myStr !== 'foo'

এমনকি আপনার যদি কোনও রেইগেক্স বৈশিষ্ট্য প্রয়োজন হয় তবে আপনি এই নিন্দাকে পরীক্ষার বাইরে রাখতে পারেন (এখানে, কেস সংবেদনশীলতা এবং সীমার মিল):

!/^[a-f]oo$/i.test(myStr)

এই উত্তরের শীর্ষে রেজেক্স সমাধান সহায়ক হতে পারে, তবে, এমন পরিস্থিতিতে যেখানে ইতিবাচক রেজেক্স পরীক্ষা প্রয়োজন (সম্ভবত কোনও এপিআই দ্বারা)।


পেছনের সাদা স্থান সম্পর্কে কী? উদাহরণস্বরূপ, আমি যদি স্ট্রিং দিয়ে ফেল করতে চাই " hede "?
eagor

@ ইগোর \sনির্দেশটি একটি একক সাদা স্থানের চরিত্রের সাথে মেলে
রায় টিঙ্কার

ধন্যবাদ, তবে আমি এই কাজটি করার জন্য রেজেক্স আপডেট করতে পরিচালনা করি নি।
Eagor

2
@ ইগর:^(?!\s*hede\s*$).*
রায় টিঙ্কার

52

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

ভিসিএসএন এই অপারেটরটিকে সমর্থন করে (যা এটি {c}পোস্টফিক্সকে বোঝায় )।

চিঠি (লেবেল আছে: আপনি প্রথমে আপনার এক্সপ্রেশন ধরণ নির্ধারণ lal_charথেকে) বাছাই aকরার z(যখন complementation সঙ্গে কাজ বর্ণমালা সংজ্ঞা হয়, অবশ্যই, খুব গুরুত্বপূর্ণ) উদাহরণস্বরূপ, এবং "মান" প্রতিটি শব্দ জন্য নির্ণিত মাত্র একটি বুলিয়ান : trueশব্দটি স্বীকৃত false, প্রত্যাখ্যানিত।

পাইথনে:

In [5]: import vcsn
        c = vcsn.context('lal_char(a-z), b')
        c
Out[5]: {a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}  𝔹

তারপরে আপনি আপনার অভিব্যক্তি লিখুন:

In [6]: e = c.expression('(hede){c}'); e
Out[6]: (hede)^c

এই এক্সপ্রেশনটি একটি অটোমেটনে রূপান্তর করুন:

In [7]: a = e.automaton(); a

সংশ্লিষ্ট অটোমেটন

অবশেষে, এই অটোমেটনটিকে একটি সাধারণ অভিব্যক্তিতে ফিরিয়ে দিন।

In [8]: print(a.expression())
        \e+h(\e+e(\e+d))+([^h]+h([^e]+e([^d]+d([^e]+e[^]))))[^]*

যেখানে +সাধারণত চিহ্নিত করা হয় |, \eখালি শব্দটি বোঝায় এবং [^]সাধারণত .(কোনও চরিত্র) লেখা হয় । সুতরাং, কিছুটা পুনর্লিখনের সাথে()|h(ed?)?|([^h]|h([^e]|e([^d]|d([^e]|e.)))).*

আপনি এখানে এই উদাহরণটি দেখতে পারেন এবং সেখানে ভিসিএসএন চেষ্টা করে দেখতে পারেন ।


6
সত্য, তবে কুরুচিপূর্ণ এবং ছোট চরিত্রের সেটগুলির জন্য কেবল এটি কার্যকর। আপনি ইউনিকোড স্ট্রিংগুলি দিয়ে এটি করতে চান না :-)
পুনরায় পোস্টার

এর জন্য আরও সরঞ্জাম রয়েছে যা সবচেয়ে বেশি চিত্তাকর্ষক হ'ল রাগেল । সেখানে এটি প্রারম্ভিকভাবে সাজানো ম্যাচের জন্য (যে কোনও * - ('হি' কোনও *)) অথবা আন-সাইন ইন করার জন্য (যে কোনও * - ('হি' কোনও *)) লেখা হবে।
পিটার কে

1
@ রিনিয়ারপোস্ট: কেন এটি কুরুচিপূর্ণ এবং ইউনিকোডে সমস্যা কী? আমি দুজনের সাথে একমত হতে পারি না। (আমার ভিসিএনএন নিয়ে কোনও অভিজ্ঞতা নেই, তবে ডিএফএ নিয়ে আছে)।
পিটার কে

3
@ পেড্রো গিমেনো আপনি যখন নোঙ্গর করলেন, আপনি প্রথমে পেরেনের মধ্যে এই রেজেক্সটি স্থাপন করার বিষয়টি নিশ্চিত করেছেন? অন্যথায় অ্যাঙ্করগুলির মধ্যে পূর্ববর্তী অবস্থানগুলি এবং দুর্দান্তভাবে |খেলবে না। '^(()|h(ed?)?|([^h]|h([^e]|e([^d]|d([^e]|e.)))).*)$'
আকিম

1
আমি remarking এটা মূল্য যে এই পদ্ধতি লাইন যে মেলানোর জন্য নয় মনে হয় না শব্দ 'Hede', বদলে লাইন চেয়ে থাকে না শব্দ 'Hede' যা কি ওপি চাইলেন। পরেরটির জন্য আমার উত্তর দেখুন।
পেড্রো গিমেনো

51

একটি স্বেচ্ছাসেবক রেজেক্সকে তুচ্ছ করা কেন সহজ নয় তার একটি ভাল ব্যাখ্যা এখানে । আমাকে অন্যান্য উত্তরগুলির সাথে একমত হতে হবে, যদিও: এটি যদি একটি অনুমানমূলক প্রশ্ন ব্যতীত অন্য কোনও কিছু হয়, তবে এখানে একটি রেজেক্স সঠিক পছন্দ নয়।


10
কিছু সরঞ্জাম, এবং বিশেষত মাইসকিल्डডাম্পস্লো কেবলমাত্র ডেটা ফিল্টার করার জন্য এই উপায়ে প্রস্তাব দেয়, সুতরাং এই জাতীয় ক্ষেত্রে এটি করার জন্য একটি রেজেেক্স সন্ধান করা সরঞ্জামটির পুনর্লিখন ছাড়াও সেরা সমাধান (এর জন্য বিভিন্ন প্যাচগুলি মাইএসকিউএল এবি / সান দ্বারা অন্তর্ভুক্ত করা হয়নি) / ওরাকল।
এফজিএম

1
ঠিক আমার পরিস্থিতি থেকে বিরূপ। वेग টেম্পলেট ইঞ্জিনটি কখন রূপান্তর প্রয়োগ করতে হবে তা স্থির করার জন্য নিয়মিত অভিব্যক্তি ব্যবহার করে (এসটিএমএল এইচটিএমএল) এবং আমি চাই যে এটি সর্বদা একটি পরিস্থিতিতে ছাড় না করে কাজ করবে।
হেন্নো ভার্মিউলেন

1
কী বিকল্প আছে? রেগেক্সের পাশাপাশি নির্ভুল স্ট্রিংয়ের মিল করতে পারে এমন কোনও কিছুই আমি এর আগে কখনও পাইনি। ওপি যদি কোনও প্রোগ্রামিং ভাষা ব্যবহার করে থাকে তবে অন্যান্য সরঞ্জামাদি উপলভ্য হতে পারে তবে তিনি যদি কোডটি লেখেন না তবে সম্ভবত অন্য কোনও পছন্দ নেই।
কিংফ্রিটো_5005

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

48

নেতিবাচক চেহারা সহ, নিয়মিত প্রকাশটি নির্দিষ্ট প্যাটার্নযুক্ত এমন কোনও কিছুতে মেলে। এটি উত্তর এবং বার্ট কিয়ার্স দ্বারা ব্যাখ্যা করা হয়েছে। দুর্দান্ত ব্যাখ্যা!

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

এখানে উন্নত রেজেক্সটি রয়েছে:

/^(?!.*?hede).*$/

Noteণাত্মক চেহারা অংশে (*?) অলস কোয়ানটিফায়ারটি isচ্ছিক, আপনি আপনার ডেটার উপর নির্ভর করে লোভী কোয়ানটিফায়ার ব্যবহার করতে পারেন: যদি 'হেড' উপস্থিত থাকে এবং পাঠ্যের শুরুতে অর্ধেক হয়, তবে অলস কোয়ানটিফায়ারটি দ্রুত হতে; অন্যথায়, লোভী পরিমাণটি দ্রুত হতে পারে। তবে 'হেড' উপস্থিত না হলে উভয়ই সমান ধীর হবে।

এখানে ডেমো কোড

লুক হেড সম্পর্কে আরও তথ্যের জন্য, দয়া করে দুর্দান্ত নিবন্ধটি দেখুন: লুয়াহেড এবং লুকবিহাইডে দক্ষতা অর্জন করা

এছাড়াও, দয়া করে জটিল নিয়মিত অভিব্যক্তি তৈরি করতে সহায়তা করে এমন একটি জাভাস্ক্রিপ্ট নিয়মিত এক্সপ্রেশন জেনারেটর RegexGen.js দেখুন । RegexGen.js এর সাহায্যে আপনি আরও বেশি পঠনযোগ্য উপায়ে রেজেক্স তৈরি করতে পারেন:

var _ = regexGen;

var regex = _(
    _.startOfLine(),             
    _.anything().notContains(       // match anything that not contains:
        _.anything().lazy(), 'hede' //   zero or more chars that followed by 'hede',
                                    //   i.e., anything contains 'hede'
    ), 
    _.endOfLine()
);

3
সুতরাং কেবল প্রদত্ত স্ট্রিংটিতে str1 এবং str2 নেই কিনা তা ^(?!.*(str1|str2)).*$
খতিয়ে দেখতে

1
হ্যাঁ, বা আপনি অলস পরিমাণটি ব্যবহার করতে পারেন: ^(?!.*?(?:str1|str2)).*$আপনার ডেটার উপর নির্ভর করে। যোগ করা হয়েছে ?:যেহেতু আমাদের এটি ক্যাপচার করার দরকার নেই।
amobiz

এটি এখন পর্যন্ত 10xms এর একটি ফ্যাক্টর দ্বারা সেরা উত্তর। আপনি যদি আপনার jsfizz কোড এবং উত্তরগুলিতে ফলাফল যুক্ত করেন তবে লোকেরা এটি লক্ষ্য করতে পারে। আমি আশ্চর্য হই যে কেন কোনও হিড নেই যখন অলস সংস্করণ লোভী সংস্করণের তুলনায় দ্রুত is তাদের কি একই পরিমাণ সময় নেওয়া উচিত নয়?
ব্যবহারকারী5389726598465

হ্যাঁ, তারা উভয়ই পুরো পাঠ্য পরীক্ষা করে দেখাতে একই সময় নেয়।
অ্যামোবিজ

41

benchmarks

আমি উপস্থাপিত কয়েকটি বিকল্পের মূল্যায়ন এবং তাদের কর্মক্ষমতা তুলনা করার পাশাপাশি কিছু নতুন বৈশিষ্ট্য ব্যবহার করার সিদ্ধান্ত নিয়েছি। .NET রেজেক্স ইঞ্জিনে বেঞ্চমার্কিং: http://regexhero.net/tester/

বেঞ্চমার্ক পাঠ্য:

প্রথম 7 টি লাইন মিলবে না, যেহেতু সেগুলিতে অনুসন্ধান করা এক্সপ্রেশন রয়েছে, যখন নীচের 7 টি লাইন মিলবে!

Regex Hero is a real-time online Silverlight Regular Expression Tester.
XRegex Hero is a real-time online Silverlight Regular Expression Tester.
Regex HeroRegex HeroRegex HeroRegex HeroRegex Hero is a real-time online Silverlight Regular Expression Tester.
Regex Her Regex Her Regex Her Regex Her Regex Her Regex Her Regex Hero is a real-time online Silverlight Regular Expression Tester.
Regex Her is a real-time online Silverlight Regular Expression Tester.Regex Hero
egex Hero egex Hero egex Hero egex Hero egex Hero egex Hero Regex Hero is a real-time online Silverlight Regular Expression Tester.
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRegex Hero is a real-time online Silverlight Regular Expression Tester.

Regex Her
egex Hero
egex Hero is a real-time online Silverlight Regular Expression Tester.
Regex Her is a real-time online Silverlight Regular Expression Tester.
Regex Her Regex Her Regex Her Regex Her Regex Her Regex Her is a real-time online Silverlight Regular Expression Tester.
Nobody is a real-time online Silverlight Regular Expression Tester.
Regex Her o egex Hero Regex  Hero Reg ex Hero is a real-time online Silverlight Regular Expression Tester.

ফলাফল:

ফলাফলগুলি হ'ল প্রতি সেকেন্ডে 3 রানের মাঝামাঝি হিসাবে - বড় সংখ্যা = আরও ভাল

01: ^((?!Regex Hero).)*$                    3.914   // Accepted Answer
02: ^(?:(?!Regex Hero).)*$                  5.034   // With Non-Capturing group
03: ^(?>[^R]+|R(?!egex Hero))*$             6.137   // Lookahead only on the right first letter
04: ^(?>(?:.*?Regex Hero)?)^.*$             7.426   // Match the word and check if you're still at linestart
05: ^(?(?=.*?Regex Hero)(?#fail)|.*)$       7.371   // Logic Branch: Find Regex Hero? match nothing, else anything

P1: ^(?(?=.*?Regex Hero)(*FAIL)|(*ACCEPT))  ?????   // Logic Branch in Perl - Quick FAIL
P2: .*?Regex Hero(*COMMIT)(*FAIL)|(*ACCEPT) ?????   // Direct COMMIT & FAIL in Perl

যেহেতু .NET অ্যাকশন ক্রিয়াগুলি (* FAIL ইত্যাদি) সমর্থন করে না আমি P1 এবং P2 সমাধানগুলি পরীক্ষা করতে পারিনি।

সারসংক্ষেপ:

আমি বেশিরভাগ প্রস্তাবিত সমাধানগুলি পরীক্ষা করার চেষ্টা করেছি, কিছু শব্দের জন্য কিছু অপ্টিমাইজেশন সম্ভব। উদাহরণস্বরূপ, যদি অনুসন্ধানের স্ট্রিংয়ের প্রথম দুটি অক্ষর একই না হয়, তবে উত্তর 03 এ প্রসারিত হতে পারে ^(?>[^R]+|R+(?!egex Hero))*$ ছোট আকারের কার্যকারিতা লাভের ফলে ।

তবে সামগ্রিকভাবে সর্বাধিক পঠনযোগ্য এবং পারফরম্যান্স-ভিত্তিক দ্রুত সমাধানটি শর্তসাপূর্ণ স্টেটমেন্ট ব্যবহার করে 05 বা প্যাসিসিভ কোয়ান্টিফায়ার সহ 04 বলে মনে হচ্ছে। আমি মনে করি পার্ল সমাধানগুলি আরও দ্রুত এবং আরও সহজে পঠনযোগ্য হওয়া উচিত।


5
^(?!.*hede)আপনারও সময় করা উচিত । /// এছাড়াও, ম্যাচিং কর্পস এবং অ-মিল না হওয়া কর্পাসের জন্য আলাদাভাবে অভিব্যক্তিটি র‌্যাঙ্ক করা আরও ভাল কারণ এটি সাধারণত এমন একটি ক্ষেত্রে দেখা যায় যা বেশিরভাগ লাইনের সাথে মেলে না বা বেশিরভাগ লাইনে না মিলায়।
ইকগামি

32

রেজেক্স নয়, তবে আমি শব্দটি দূরীকরণের জন্য পাইপ সহ সিরিয়াল গ্রেপগুলি ব্যবহার করার পক্ষে এটি যৌক্তিক এবং দরকারী বলে মনে করেছি।

যেমন। সমস্ত মন্তব্য ছাড়াই একটি অ্যাপাচি কনফিগারেশন ফাইল অনুসন্ধান করুন-

grep -v '\#' /opt/lampp/etc/httpd.conf      # this gives all the non-comment lines

এবং

grep -v '\#' /opt/lampp/etc/httpd.conf |  grep -i dir

সিরিয়াল গ্রেপের এর যুক্তিটি (কোনও মন্তব্য নয়) এবং (দির সাথে মেলে)


2
আমি মনে করি তিনিgrep -v
এঞ্জেল.কিং .47

9
এটা বিপজ্জনক. পছন্দ লাইন ব্যার্থgood_stuff #comment_stuff
জাভি Montero

29

এটির সাহায্যে, আপনি প্রতিটি পজিশনের দিকে নজর দিতে এড়াবেন:

/^(?:[^h]+|h++(?!ede))*+$/

(। নেট জন্য) সমতুল্য:

^(?>(?:[^h]+|h+(?!ede))*)$

পুরানো উত্তর:

/^(?>[^h]+|h+(?!ede))*$/

7
ভাল যুক্তি; আমি অবাক হয়েছি কেউ আগে এই পদ্ধতির উল্লেখ করেনি। যাইহোক, সেই নির্দিষ্ট রেজেক্স মেলে না এমন পাঠ্যের ক্ষেত্রে প্রয়োগ করা হলে বিপর্যয়কর ব্যাকট্র্যাকিংয়ের ঝুঁকির মধ্যে রয়েছে । আমি এটি কীভাবে করব তা এখানে:/^[^h]*(?:h+(?!ede)[^h]*)*$/
অ্যালান মুর

... বা আপনি কেবল সমস্ত কোয়ান্টিফায়ারকেই অধিকারী করতে পারেন। ;)
অ্যালান মুর

@ অ্যালান মুর - আমিও অবাক। নীচে একটি উত্তরে একই প্যাটার্নটি পোস্ট করার পরে আমি কেবল এখানে আপনার মন্তব্য (এবং পাইলের সেরা রেজেক্স) দেখেছি।
ridgerunner

@ridgerunner, সেরা হতে হবে না। আমি বেঞ্চমার্ক দেখেছি যেখানে শীর্ষের উত্তর আরও ভাল করে। (আমি এই সম্পর্কে অবাক হয়েছি))
কিট্যাক্স

23

পূর্বোক্ত (?:(?!hede).)*দুর্দান্ত কারণ এটি নোঙ্গর করা যায়।

^(?:(?!hede).)*$               # A line without hede

foo(?:(?!hede).)*bar           # foo followed by bar, without hede between them

নিম্নলিখিত ক্ষেত্রে এই ক্ষেত্রে যথেষ্ট হবে:

^(?!.*hede)                    # A line without hede

এই সরলীকরণটি "এবং" ধারা যুক্ত করার জন্য প্রস্তুত:

^(?!.*hede)(?=.*foo)(?=.*bar)   # A line with foo and bar, but without hede
^(?!.*hede)(?=.*foo).*bar       # Same

20

আমি এটি কীভাবে করব তা এখানে:

^[^h]*(h(?!ede)[^h]*)*$

অন্যান্য উত্তরগুলির তুলনায় নির্ভুল এবং আরও দক্ষ। এটি ফ্রেডেলের "আনরোলিং-দ্য লুপ" দক্ষতা কৌশল প্রয়োগ করে এবং এর থেকে অনেক কম ব্যাকট্র্যাকিংয়ের প্রয়োজন।


17

আপনি যদি একটি চরিত্রের সাথে মিল করতে চান চরিত্র শ্রেণীর অবহেলা করার মতো শব্দটিকে তুচ্ছ করে তুলতে:

উদাহরণস্বরূপ, একটি স্ট্রিং:

<?
$str="aaa        bbb4      aaa     bbb7";
?>

ব্যবহার করবেন না:

<?
preg_match('/aaa[^bbb]+?bbb7/s', $str, $matches);
?>

ব্যবহার করুন:

<?
preg_match('/aaa(?:(?!bbb).)+?bbb7/s', $str, $matches);
?>

লক্ষ্য করুন "(?!bbb)."তন্ন তন্ন lookbehind কিংবা lookahead, এটা lookcurrent, উদাহরণস্বরূপ হল:

"(?=abc)abcde", "(?!abc)abcde"

3
পার্ল রিজেক্সেপ্টে কোনও "লুককন্ট্রেন্ট" নেই। এটি সত্যই একটি নেতিবাচক চেহারা (উপসর্গ (?!) ix ইতিবাচক (?=লুকহ্যাডের উপসর্গটি হবে যখন যথাক্রমে পূর্বসূচী অনুসারে (?<!এবং (?<=যথাক্রমে হবে। তাকাতে যাওয়ার অর্থ হ'ল আপনি পরবর্তী অক্ষরগুলি গ্রাস না করে (সুতরাং "এগিয়ে") পড়েছেন। নজরদারিটির অর্থ হ'ল আপনি ইতিমধ্যে গ্রাস করা অক্ষরগুলি পরীক্ষা করেন।
দিদিয়ার এল

14

একটি, আমার মতামত, শীর্ষ উত্তরের আরও পঠনযোগ্য বৈকল্পিক:

^(?!.*hede)

মূলত, "লাইনের শুরুতে ম্যাচ করুন যদি এবং এটির মধ্যে 'হেড' না থাকে কেবল" - সুতরাং প্রয়োজনীয়তাটি প্রায় প্রত্যক্ষভাবে রেজেক্সে অনুবাদ করা হয়।

অবশ্যই একাধিক ব্যর্থতার প্রয়োজনীয়তা থাকা সম্ভব:

^(?!.*(hede|hodo|hada))

বিবরণ: ^ অ্যাঙ্করটি নিশ্চিত করে যে রেজেক্স ইঞ্জিন স্ট্রিংয়ের প্রতিটি স্থানে ম্যাচটি আবার চেষ্টা করবে না, যা প্রতিটি স্ট্রিংয়ের সাথে মিলবে।

শুরুতে ch অ্যাঙ্করটি বোঝায় লাইনটির শুরুতে প্রতিনিধিত্ব করা। গ্রেপ সরঞ্জামটি প্রতিটি লাইনের সাথে এক সাথে মেলে, এমন একটি প্রসঙ্গে যেখানে আপনি মাল্টলাইন স্ট্রিংয়ের সাথে কাজ করছেন, আপনি "মি" পতাকা ব্যবহার করতে পারেন:

/^(?!.*hede)/m # JavaScript syntax

অথবা

(?m)^(?!.*hede) # Inline flag

একাধিক অবহেলা সহ দুর্দান্ত উদাহরণ।
পিটার প্যারাডা

শীর্ষ উত্তরের একটি পার্থক্য হ'ল এটি কোনও কিছুর সাথে মেলে না, এবং এটি পুরো লাইনের সাথে "
হেড

13

ওপি নির্দিষ্ট করে দেয়নি বা Tagপ্রসঙ্গটি নির্দেশ করার জন্য পোস্টটি (প্রোগ্রামিং ভাষা, সম্পাদক, সরঞ্জাম) এর মধ্যে রেজেক্স ব্যবহার করা হবে।

আমার জন্য, কখনও কখনও ফাইল ব্যবহার করে সম্পাদনা করার সময় আমার এটি করা দরকার Textpad

Textpad কিছু রেইজেক্সকে সমর্থন করে তবে লুক এবং হেডবাইন্ড সমর্থন করে না, তাই এটি কয়েকটি পদক্ষেপ নেয়।

যদি আমি সমস্ত লাইন ধরে রাখতে চাই যা স্ট্রিংটি ধারণ করে নাhede , আমি এটি এটি করব:

1. কোনও পাঠ্য সম্বলিত প্রতিটি লাইনের শুরুতে একটি অনন্য "ট্যাগ" যুক্ত করতে পুরো ফাইলটি অনুসন্ধান / প্রতিস্থাপন করুন।

    Search string:^(.)  
    Replace string:<@#-unique-#@>\1  
    Replace-all  

২. স্ট্রিং সহ সমস্ত লাইন মুছুন hede(প্রতিস্থাপনের স্ট্রিং খালি রয়েছে):

    Search string:<@#-unique-#@>.*hede.*\n  
    Replace string:<nothing>  
    Replace-all  

3. এই মুহুর্তে, সমস্ত অবশিষ্ট লাইন করবেন না স্ট্রিং ধারণ hede। সমস্ত লাইন থেকে অনন্য "ট্যাগ" সরান (প্রতিস্থাপনের স্ট্রিং খালি রয়েছে):

    Search string:<@#-unique-#@>
    Replace string:<nothing>  
    Replace-all  

এখন আপনার কাছে স্ট্রিংযুক্ত সমস্ত লাইন সহ মূল পাঠ্য রয়েছে hede


যদি আমি কেবল সেই লাইনে অন্য কিছু করার চেষ্টা করি যা স্ট্রিংটি ধারণ করে নাhede , আমি এটি এটি করব:

1. কোনও পাঠ্য সম্বলিত প্রতিটি লাইনের শুরুতে একটি অনন্য "ট্যাগ" যুক্ত করতে পুরো ফাইলটি অনুসন্ধান / প্রতিস্থাপন করুন।

    Search string:^(.)  
    Replace string:<@#-unique-#@>\1  
    Replace-all  

২. স্ট্রিংটি ধারণ করে এমন সমস্ত লাইনের hedeজন্য অনন্য "ট্যাগ" সরান:

    Search string:<@#-unique-#@>(.*hede)
    Replace string:\1  
    Replace-all  

3. এই মুহুর্তে, সব লাইন যে অনন্য "ট্যাগ" দিয়ে শুরু, না স্ট্রিং ধারণ hede। আমি এখন কেবল সেই লাইনে আমার সামথিং অন্য কিছু করতে পারি ।

৪. যখন আমার কাজ শেষ হয়, তখন আমি সমস্ত লাইন থেকে অনন্য "ট্যাগ" সরিয়ে ফেলি (প্রতিস্থাপনের স্ট্রিং খালি):

    Search string:<@#-unique-#@>
    Replace string:<nothing>  
    Replace-all  

12

যেহেতু অন্য কোন প্রশ্ন জিজ্ঞাসা করা হয়েছিল তার সরাসরি উত্তর দেয়নি , তাই আমি করব।

উত্তরটি হ'ল পসিক্সের grepসাহায্যে আক্ষরিকভাবে এই অনুরোধটি পূরণ করা অসম্ভব:

grep "<Regex for 'doesn't contain hede'>" input

কারণটি হ'ল POSIX grepকেবলমাত্র বেসিক নিয়মিত এক্সপ্রেশনগুলির সাথে কাজ করা প্রয়োজন , যা কেবলমাত্র সেই কাজটি সম্পাদনের জন্য যথেষ্ট শক্তিশালী নয় (তারা বিকল্প এবং বন্ধনীর অভাবের কারণে নিয়মিত ভাষাগুলি পার্স করতে সক্ষম নয়)।

তবে, জিএনইউ grepএমন এক্সটেনশনগুলি প্রয়োগ করে যা এটির অনুমতি দেয়। বিশেষত, \|জিএনইউ'র বিআরই বাস্তবায়নের জন্য বিকল্প অপারেটর এবং \(এবং \)প্রথম বন্ধনী। যদি আপনার নিয়মিত এক্সপ্রেশন ইঞ্জিন বিকল্প, নেতিবাচক বন্ধনী এক্সপ্রেশন, প্রথম বন্ধনী এবং ক্লিন তারকা সমর্থন করে এবং স্ট্রিংয়ের শুরু এবং শেষ প্রান্তটিতে অ্যাঙ্কর করতে সক্ষম হয় তবে এই পদ্ধতির জন্য আপনার প্রয়োজন। তবে লক্ষ করুন যে negativeণাত্মক সেটগুলি [^ ... ]সেগুলি ছাড়াও খুব সুবিধাজনক, কারণ অন্যথায়, আপনাকে সেগুলি ফর্মের একটি এক্সপ্রেশন দিয়ে প্রতিস্থাপন করতে হবে (a|b|c| ... )যা সেটে থাকা প্রতিটি চরিত্রকে তালিকাবদ্ধ করে, যা অত্যন্ত ক্লান্তিকর এবং অত্যধিক দীর্ঘ, এমনকি আরও যদি পুরো চরিত্র সেটটি ইউনিকোড।

জিএনইউর সাথে grepউত্তরটি এমন কিছু হবে:

grep "^\([^h]\|h\(h\|eh\|edh\)*\([^eh]\|e[^dh]\|ed[^eh]\)\)*\(\|h\(h\|eh\|edh\)*\(\|e\|ed\)\)$" input

( গ্রেইলের সাথে পাওয়া যায় এবং হাতে তৈরি আরও কিছু অপ্টিমাইজেশন রয়েছে)।

এছাড়াও আপনি একটি টুল ব্যবহার করতে পারে কার্যকরী রেগুলার এক্সপ্রেশন সম্প্রসারিত মত egrepব্যাকস্ল্যাশ পরিত্রাণ পেতে:

egrep "^([^h]|h(h|eh|edh)*([^eh]|e[^dh]|ed[^eh]))*(|h(h|eh|edh)*(|e|ed))$" input

এটি পরীক্ষা করার জন্য এখানে একটি স্ক্রিপ্ট রয়েছে (নোট করুন এটি testinput.txtবর্তমান ডিরেক্টরিতে একটি ফাইল উত্পন্ন করে ):

#!/bin/bash
REGEX="^\([^h]\|h\(h\|eh\|edh\)*\([^eh]\|e[^dh]\|ed[^eh]\)\)*\(\|h\(h\|eh\|edh\)*\(\|e\|ed\)\)$"

# First four lines as in OP's testcase.
cat > testinput.txt <<EOF
hoho
hihi
haha
hede

h
he
ah
head
ahead
ahed
aheda
ahede
hhede
hehede
hedhede
hehehehehehedehehe
hedecidedthat
EOF
diff -s -u <(grep -v hede testinput.txt) <(grep "$REGEX" testinput.txt)

আমার সিস্টেমে এটি মুদ্রিত হয়:

Files /dev/fd/63 and /dev/fd/62 are identical

প্রত্যাশিত.

বিশদ সম্পর্কে আগ্রহীদের জন্য, নিযুক্ত কৌশলটি হ'ল শব্দটির সাথে মেলে এমন নিয়মিত অভিব্যক্তি রূপান্তর করা, যা প্রতিটি গ্রহণযোগ্যতার স্থিতিকে অ-গ্রহণযোগ্যতা এবং তদ্বিপরীত করে পরিবর্তিত করে এবং তারপরে ফলস্বর এফএকে আবার রূপান্তর করে the একটি নিয়মিত প্রকাশ।

সবশেষে যেমনটি লক্ষ করেছেন যে, আপনার নিয়মিত অভিব্যক্তি ইঞ্জিন যদি নেতিবাচক বর্ণনাকে সমর্থন করে তবে এটি কার্যকে অনেক সহজ করে তোলে। উদাহরণস্বরূপ, জিএনইউ গ্রেপ সহ:

grep -P '^((?!hede).)*$' input

আপডেট: আমি সম্প্রতি পিএইচপিতে লিখিত কেন্ডাল হপকিন্সের দুর্দান্ত ফরমাল থিওরি লাইব্রেরিটি পেয়েছি , যা গ্রিলের মতো কার্যকারিতা সরবরাহ করে। এটি ব্যবহার করে এবং নিজের লেখা একটি সরলীকরণকারী, আমি একটি ইনপুট বাক্যাংশ (কেবলমাত্র বর্ণানুক্রমিক এবং স্পেস অক্ষর বর্তমানে সমর্থিত) দিয়ে একটি নেতিবাচক নিয়মিত প্রকাশের একটি অনলাইন জেনারেটর লিখতে সক্ষম হয়েছি: http://www.formauri.es/personal/ pgimeno / বিবিধ / অ ম্যাচ Regex /

জন্য hedeআউটপুট:

^([^h]|h(h|e(h|dh))*([^eh]|e([^dh]|d[^eh])))*(h(h|e(h|dh))*(ed?)?)?$

যা উপরের সমতুল্য।


11

রুবি -২.৪.১ প্রবর্তন হওয়ার পরে, আমরা রুবির নিয়মিত অভিব্যক্তিতে নতুন অনুপস্থিত অপারেটরটি ব্যবহার করতে পারি

অফিসিয়াল ডক থেকে

(?~abc) matches: "", "ab", "aab", "cccc", etc.
It doesn't match: "abc", "aabc", "ccccabc", etc.

সুতরাং, আপনার ক্ষেত্রে আপনার ^(?~hede)$জন্য কাজ করে

2.4.1 :016 > ["hoho", "hihi", "haha", "hede"].select{|s| /^(?~hede)$/.match(s)}
 => ["hoho", "hihi", "haha"]

9

পিসিআরই ক্রিয়া মাধ্যমে (*SKIP)(*F)

^hede$(*SKIP)(*F)|^.*$

এটি সম্পূর্ণরূপে লাইনটি এড়িয়ে যাবে যা সঠিক স্ট্রিং ধারণ করে hedeএবং বাকি সমস্ত লাইনের সাথে মেলে।

ডেমো

অংশগুলি সম্পাদন:

আসুন উপরের রেজেক্সটিকে দুটি ভাগে বিভক্ত করে বিবেচনা করি।

  1. |প্রতীক আগে অংশ । অংশটি মিলবে না

    ^hede$(*SKIP)(*F)
  2. |প্রতীক পরে অংশ । অংশটি মিলতে হবে

    ^.*$

অংশ 1

রেজেক্স ইঞ্জিন প্রথম অংশ থেকে এটি কার্যকর করতে শুরু করবে।

^hede$(*SKIP)(*F)

ব্যাখ্যা:

  • ^ জোর দিয়েছিল যে আমরা শুরুতে আছি।
  • hede স্ট্রিং মেলে hede
  • $ জোর দিয়ে যায় যে আমরা লাইনের শেষে আছি।

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

অংশ ২

^.*$

ব্যাখ্যা:

  • ^ জোর দিয়েছিল যে আমরা শুরুতে আছি। অর্থাত্, এটি লাইনের একটিকে বাদ দিয়ে শুরু করে সমস্ত লাইনের সাথে মেলে hedeএখানে ডেমো দেখুন ।
  • .*মাল্টলাইন মোডে, .নিউলাইন বা ক্যারেজ রিটার্ন অক্ষর ব্যতীত অন্য কোনও চরিত্রের সাথে মেলে। এবং *আগের অক্ষরটি শূন্য বা আরও কয়েকবার পুনরাবৃত্তি করবে। সুতরাং .*পুরো লাইন মেলে। এখানে ডেমো দেখুন ।

    আরে কেন আপনি যুক্ত করেছেন? * পরিবর্তে। +?

    কারণ .*একটি ফাঁকা লাইনের সাথে মেলে তবে .+ফাঁকা সাথে মেলে না। আমরা ব্যতীত সমস্ত লাইনের সাথে মিল রাখতে চাই hede, ইনপুটটিতে ফাঁকা লাইন হওয়ার সম্ভাবনাও থাকতে পারে। সুতরাং আপনি .*পরিবর্তে ব্যবহার করা আবশ্যক .+.+আগের চরিত্রটি এক বা একাধিকবার পুনরাবৃত্তি করবে। এখানে.* একটি ফাঁকা লাইন মেলে দেখুন ।

  • $ লাইন অ্যাঙ্কর শেষ এখানে প্রয়োজন হয় না।


7

এটি আপনার কোডে দুটি রেইজেক্সের কাছে আরও রক্ষণাবেক্ষণযোগ্য হতে পারে, প্রথমটি ম্যাচটি করা এবং তারপরে এটি যদি মেইলগুলিতে উদাহরণস্বরূপ আপনি ব্লক করতে চান তার জন্য দ্বিতীয় রেজেক্সটি চালায় তবে ^.*(hede).*আপনার কোডে উপযুক্ত যুক্তি থাকতে হবে।

ঠিক আছে, আমি স্বীকার করি এটি পোস্ট করা পোস্টের সত্যিকারের উত্তর নয় এবং এটি একটি একক রেজেক্সের চেয়ে কিছুটা বেশি প্রসেসিংও ব্যবহার করতে পারে। তবে যে বিকাশকারীরা এখানে আউটিলার কেসের জন্য দ্রুত জরুরি সমাধানের সন্ধানের জন্য এসেছিলেন তাদের পক্ষে এই সমাধানটিকে উপেক্ষা করা উচিত নয়।


5

TXR ভাষা Regex অস্বীকৃতি সমর্থন করে।

$ txr -c '@(repeat)
@{nothede /~hede/}
@(do (put-line nothede))
@(end)'  Input

আরও জটিল উদাহরণ: শুরু হওয়া aএবং শেষ হওয়া সমস্ত লাইনের সাথে মেলে z, তবে সাবস্ট্রিংটি ধারণ করে না hede:

$ txr -c '@(repeat)
@{nothede /a.*z&~.*hede.*/}
@(do (put-line nothede))
@(end)' -
az         <- echoed
az
abcz       <- echoed
abcz
abhederz   <- not echoed; contains hede
ahedez     <- not echoed; contains hede
ace        <- not echoed; does not end in z
ahedz      <- echoed
ahedz

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


মনে রাখবেন এটি ইলাস্টিক অনুসন্ধান লুসিন ভিত্তিক রেজেক্সের সমাধানও।
উইক্টর স্ট্রিবিউউ

5

আর একটি বিকল্প হ'ল ইতিবাচক চেহারা-এগিয়ে যুক্ত করা এবং তা পরীক্ষা করা hehe ইনপুট লাইনের কোথাও আছে তা , তারপরে আমরা এর সাথে অনুরূপ অভিব্যক্তি সহ এটিকে প্রত্যাখ্যান করব:

^(?!(?=.*\bhede\b)).*$

শব্দ সীমানা সহ।


Regex101.com এর উপরের ডান প্যানেলে এই অভিব্যক্তিটি ব্যাখ্যা করা হয়েছে , আপনি যদি এটি অন্বেষণ / সরল / পরিবর্তন করতে চান এবং এই লিঙ্কে , আপনি যদি দেখতে চান তবে এটি কিছু নমুনা ইনপুটগুলির সাথে কীভাবে মেলে তা দেখতে পারেন।


রেজেক্স সার্কিট

jex.im নিয়মিত এক্সপ্রেশন ভিজ্যুয়ালাইজ করে:

এখানে চিত্র বর্ণনা লিখুন


4

নীচের ফাংশন আপনাকে আপনার পছন্দসই আউটপুট পেতে সহায়তা করবে

<?PHP
      function removePrepositions($text){

            $propositions=array('/\bfor\b/i','/\bthe\b/i'); 

            if( count($propositions) > 0 ) {
                foreach($propositions as $exceptionPhrase) {
                    $text = preg_replace($exceptionPhrase, '', trim($text));

                }
            $retval = trim($text);

            }
        return $retval;
    }


?>

2

^ ((?! hede)।) * হ'ল একটি মার্জিত সমাধান, যেহেতু এটি অক্ষরগুলি গ্রাস করে আপনি এটিকে অন্য মানদণ্ডের সাথে একত্রিত করতে পারবেন না except উদাহরণস্বরূপ, বলুন যে আপনি "হেড" এর উপস্থিতি এবং "হাহা" উপস্থিতি যাচাই করতে চেয়েছিলেন। এই সমাধানটি কাজ করবে কারণ এটি অক্ষর গ্রাস করবে না:

^ (?!। \ ভেদে \ বি) (? =। \ ভাহা \ বি)


1

একটি শব্দ নেই এমন একটি লাইনের সাথে মেলে পিসিআরআই এর ব্যাকট্র্যাকিং নিয়ন্ত্রণ ক্রিয়াগুলি কীভাবে ব্যবহার করবেন

এখানে এমন একটি পদ্ধতি যা আমি আগে ব্যবহার করে দেখিনি:

/.*hede(*COMMIT)^|/

কিভাবে এটা কাজ করে

প্রথমত, এটি লাইনের কোথাও "হেড" সন্ধান করার চেষ্টা করে। সফল হলে, এই মুহুর্তে, (*COMMIT)ইঞ্জিনকে বলবে, ব্যর্থতার ঘটনায় কেবল ব্যাকট্র্যাকই নয়, সেই ক্ষেত্রে আর কোনও মিলের চেষ্টা না করে। তারপরে, আমরা এমন কোনও কিছু মিলানোর চেষ্টা করি যা সম্ভবত মেলে না (এই ক্ষেত্রে, ^)।

যদি কোনও লাইনে "হেড" না থাকে তবে দ্বিতীয় বিকল্প, একটি খালি সাবপ্যাটার্ন সফলভাবে সাবজেক্টের স্ট্রিংয়ের সাথে মেলে।

এই পদ্ধতিটি নেতিবাচক বর্ণনীর চেয়ে বেশি দক্ষ নয়, তবে আমি অনুভব করেছি যে কেউ যদি নিফটি খুঁজে পায় এবং অন্যান্য, আরও আকর্ষণীয় অ্যাপ্লিকেশনগুলির জন্য এটির জন্য একটি ব্যবহার খুঁজে পায় তবে আমি কেবল এটি এখানে ফেলে দেব।


0

একটি সহজ সমাধান না অপারেটর ব্যবহার করা হয় !

আপনার যদি বিবৃতিতে "অন্তর্ভুক্ত" মেলে এবং "বাদ দেয়" না মেলে প্রয়োজন হয়।

var contains = /abc/;
var excludes =/hede/;

if(string.match(contains) && !(string.match(excludes))){  //proceed...

আমি বিশ্বাস করি যে রেজিএক্সের ডিজাইনাররা অপারেটর নয় বরং ব্যবহারের প্রত্যাশা করেছিল।


0

কোনও রেখাংশ (পুরো রেখার বিপরীতে) যেখানে কোনও স্ট্রিং থাকে না তার সাথে মেলে ধরতে সক্ষম এমন একটি রেইজেক্স লেখার চেষ্টা করার সময় আপনি এটি গুগলে খুঁজে পাবেন । বের করার জন্য আমাকে একটু সময় দিন, তাই আমি ভাগ করে নেব:

একটি স্ট্রিং দেওয়া হয়েছে: <span class="good">bar</span><span class="bad">foo</span><span class="ugly">baz</span>

আমি এমন <span>ট্যাগগুলি মেলাতে চাই যাতে "খারাপ" স্ট্রিংটি থাকে না।

/<span(?:(?!bad).)*?>মিলবে <span class=\"good\">এবং <span class=\"ugly\">

লক্ষ্য করুন যে বন্ধনীগুলির দুটি সেট (স্তর) রয়েছে:

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

রুবিতে ডেমো:

s = '<span class="good">bar</span><span class="bad">foo</span><span class="ugly">baz</span>'
s.scan(/<span(?:(?!bad).)*?>/)
# => ["<span class=\"good\">", "<span class=\"ugly\">"]

0

ConyEdit এর সাহায্যে আপনি কমান্ড লাইনটি cc.gl !/hede/এমন রেখাগুলি পেতে ব্যবহার করতে পারেন যা রেজেক্স ম্যাচিং করে না, বা কমান্ড লাইনটি ব্যবহার cc.dl /hede/করতে পারে রেজগুলি মিলে থাকা লাইনগুলি মুছতে। তাদের একই ফলাফল রয়েছে।


0

আমি অন্য একটি উদাহরণ যুক্ত করতে চেয়েছিলাম আপনি যদি একটি সম্পূর্ণ লাইনের সাথে স্ট্রিং এক্স ধারণ করে মিল করার চেষ্টা করছেন তবে এতে স্ট্রিং ওয়াইও নেই

উদাহরণস্বরূপ, আসুন আমরা আমাদের ইউআরএল / স্ট্রিংয়ে " টেস্টি-ট্রিটস " রয়েছে কিনা তা যাচাই করতে চাই , যতক্ষণ না এটিতে কোথাও " চকোলেট " না থাকে।

এই রেজেক্স প্যাটার্নটি কাজ করবে (জাভাস্ক্রিপ্টেও কাজ করে)

^(?=.*?tasty-treats)((?!chocolate).)*$

(উদাহরণস্বরূপ বিশ্বব্যাপী, বহুরেখার পতাকা)

ইন্টারেক্টিভ উদাহরণ: https://regexr.com/53gv4

ম্যাচ

(এই ইউআরএলে "সুস্বাদু আচরণগুলি" রয়েছে এবং এতে "চকোলেট" থাকে না)

  • example.com/tasty-treats/strawberry-ice-cream
  • example.com/desserts/tasty-treats/banana-pudding
  • example.com/tasty-treats-overview

মেলে না

(এই url গুলোতে কোথাও "চকোলেট" রয়েছে - সুতরাং এতে "টেস্টি-ট্রিটস" থাকা সত্ত্বেও সেগুলি মিলবে না)

  • example.com/tasty-treats/chocolate-cake
  • example.com/home-cooking/oven-roasted-chicken
  • example.com/tasty-treats/banana-chocolate-fudge
  • example.com/desserts/chocolate/tasty-treats
  • example.com/chocolate/tasty-treats/desserts
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.