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