regex - একটি শব্দ ধারণকারী একটি লাইন মেলে নিয়মিত অভিব্যক্তি?




regex-negation regex-lookarounds (18)

benchmarks

আমি উপস্থাপিত বিকল্পগুলি মূল্যায়ন এবং তাদের কর্মক্ষমতা তুলনা করার পাশাপাশি কিছু নতুন বৈশিষ্ট্যগুলি ব্যবহার করার সিদ্ধান্ত নিয়েছি। নেট রেজেক্স ইঞ্জিনে বেঞ্চমার্কিং: 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

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

সারাংশ:

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

কিন্তু সামগ্রিকভাবে সর্বাধিক পঠনযোগ্য এবং কর্মক্ষমতা অনুসারে সবচেয়ে দ্রুত সমাধানটি একটি শর্তাধীন বিবৃতি বা 04 টি সম্ভাব্য কুইন্টিফায়ারের সাহায্যে হতে পারে। আমি পার্ল সমাধান এমনকি দ্রুত এবং আরো সহজে পাঠযোগ্য হতে হবে মনে হয়।

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

ইনপুট:

hoho
hihi
haha
hede

কোড:

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

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

hoho
hihi
haha

একটি শব্দ ধারণকারী একটি লাইন মেলে মেলে কিভাবে PCRE এর backtracking নিয়ন্ত্রণ ক্রিয়া ব্যবহার করুন

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

/.*hede(*COMMIT)^|/

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

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

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

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


Regex না, কিন্তু আমি লজিক্যাল এবং শব্দটি নল নিষ্কাশন করার জন্য পাইপ সঙ্গে সিরিয়াল greps ব্যবহার দরকারী খুঁজে পেয়েছি।

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

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

এবং

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

সিরিয়াল grep এর যুক্তি (একটি মন্তব্য নেই) এবং (ম্যাচ dir)


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

^((?!hede).)*$

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

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

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

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

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

(যেখানে /.../ regex delimiters হয়, অর্থাত, প্যাটার্ন অংশ নয়)

যদি DOT-ALL সংশোধনকারী পাওয়া যায় না, তবে আপনি অক্ষর শ্রেণী [\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 খালি স্ট্রিং হয়। Regex (?!hede). "hede" কোন "hede" দেখানো হবে কিনা তা দেখার জন্য এগিয়ে দেখায়, এবং যদি তা হয় (তাই অন্য কিছু দেখা যায়), তাহলে . (বিন্দু) একটি লাইন বিভাজক ছাড়া কোন অক্ষর মেলে হবে। লুক-আউন্সগুলিকে শূন্য-প্রস্থ-দাবি বলা হয় কারণ তারা কোনো অক্ষর ব্যবহার করে না। তারা শুধুমাত্র কিছু বলুন / বৈধ।

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

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


উল্লেখ্য যে সমাধানটি "হেড" দিয়ে শুরু হয় না :

^(?!hede).*$

সাধারণত "hede" ধারণ করার সমাধানটির চেয়ে অনেক বেশি কার্যকরী:

^((?!hede).)*$

প্রাক্তন ইনপুট স্ট্রিংয়ের প্রতিটি অবস্থানের পরিবর্তে কেবল "হেইড" এর জন্য পূর্বের চেক।


এই সঙ্গে, আপনি প্রতিটি অবস্থানের উপর একটি lookahead পরীক্ষা এড়াতে:

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

সমান (জন্য। নেট):

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

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

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

এখানে আমি কিভাবে করবো:

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

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


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

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

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

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

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

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

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

নোটিশ "(?!bbb)." না তাকান না lookahhead হয়, এটি lookcurrent হয়, উদাহরণস্বরূপ:

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

পূর্বসূরী (?:(?!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

প্রদত্ত উত্তর পুরোপুরি জরিমানা, শুধু একটি একাডেমিক পয়েন্ট:

তাত্ত্বিক কম্পিউটার বিজ্ঞান মানে নিয়মিত এক্সপ্রেশন এটি ভালো না। তাদের জন্য এটি এমন কিছু দেখতে ছিল:

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

এটি শুধুমাত্র একটি সম্পূর্ণ ম্যাচ আছে। উপ-ম্যাচের জন্য এটি করা আরও অদ্ভুত হতে হবে।


যেহেতু কেউ জিজ্ঞাসিত প্রশ্নটির সরাসরি উত্তর দেয়নি তাই আমি এটা করব।

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

grep "Regex for doesn't contain hede" Input

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

যাইহোক, GNU grep এক্সটেনশনগুলিকে প্রয়োগ করে যা এটি অনুমোদন করে। বিশেষ করে, \| জিএনইউর বিআরএসের বাস্তবায়ন অপারেশন অপারেটর এবং \( এবং \) গ্রুপিং অপারেটর। আপনার নিয়মিত অভিব্যক্তি ইঞ্জিন বিকল্প, নেতিবাচক বন্ধনী এক্সপ্রেশন, গোষ্ঠী এবং ক্লেইন তারকা সমর্থন করে এবং স্ট্রিংয়ের শুরুতে এবং শেষের দিকে নোঙ্গর করতে সক্ষম হয়, যা আপনাকে এই পদ্ধতির জন্য দরকার।

GNU grep সাথে এটি এমন কিছু হবে:

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

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

ব্যাকস্ল্যাশগুলি পরিত্রাণ পেতে আপনি এক্সপ্রেড নিয়মিত এক্সপ্রেশনগুলি যেমন, 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

প্রত্যাশিত.

বিস্তারিত জানতে আগ্রহীদের জন্য, নিয়ন্ত্রিত কৌশলটি নিয়মিত অভিব্যক্তিটি রূপান্তরিত করা যা শব্দটি একটি সীমাবদ্ধ automaton রূপে রূপান্তরিত করে, তারপর প্রতিটি স্বীকৃতি রাষ্ট্রকে স্বীকৃতি প্রদান করে এবং স্বতঃস্ফূর্তভাবে পরিবর্তন করে স্বয়ংক্রিয়ভাবে অ্যান্ট্রোমনকে বিপর্যস্ত করে এবং ফলস্বরূপ ফলস্বরূপ FA এ রূপান্তর করে একটি নিয়মিত অভিব্যক্তি।

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

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

আপডেট: আমি সম্প্রতি FormalTheory হপকিন্সের চমৎকার FormalTheory লাইব্রেরি খুঁজে পেয়েছি , যা পিএইচপি তে লেখা আছে, যা গ্রিলের মত একটি কার্যকারিতা সরবরাহ করে। এটি ব্যবহার করে এবং আমার দ্বারা লিখিত একটি সরলীকৃত, আমি একটি ইনপুট ফ্রেজ (কেবলমাত্র আলফানিউমেরিক এবং স্পেস অক্ষর সমর্থিত) নেতিবাচক নিয়মিত এক্সপ্রেশনগুলির অনলাইন জেনারেটর লিখতে সক্ষম হয়েছি: http://www.formauri.es/personal/pgimeno/misc/non-match-regex/

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

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

যা উপরে সমান।


রুবি-2.4.1 প্রবর্তনের পরে, আমরা রুবি নিয়মিত এক্সপ্রেশনগুলিতে নতুন অনুপস্থিত অপারেটর ব্যবহার করতে পারি

অফিসিয়াল doc

(?~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"]

PCRE ক্রিয়া দ্বারা (*SKIP)(*F)

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

এই সম্পূর্ণ স্ট্রিং hede এবং সমস্ত অবশিষ্ট লাইন মেলে যা লাইন skips হবে।

DEMO

অংশ সম্পাদন:

আসুন আমরা উপরের অংশটিকে দুটি অংশে বিভক্ত করে বিবেচনা করি।

  1. আগে অংশ | প্রতীক। অংশ মিলিত করা উচিত নয়

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

    ^.*$
    

অংশ 1

Regex ইঞ্জিন প্রথম অংশ থেকে তার মৃত্যুদন্ড শুরু হবে।

^hede$(*SKIP)(*F)

ব্যাখ্যা:

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

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

অংশ ২

^.*$

ব্যাখ্যা:

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

    আরে কেন আপনি যোগ। * পরিবর্তে। +?

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

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


উত্তর:

^((?!hede).)*$

ব্যাখ্যা:

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

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

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


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

<?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;
    }


?>

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

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


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

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


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







regex-group