වෙන කිසිවෙකු ප්රශ්නයට සෘජු පිළිතුරක් ලබා දී ඇති නිසා ඉල්ලූ බව , මම ඒක කරන්නම්.
පිළිතුර නම්, පොසික්ස් සමඟ grep
, මෙම ඉල්ලීම වචනාර්ථයෙන් සපුරාලිය නොහැකි ය:
grep "<Regex for 'doesn't contain hede'>" input
හේතුව, POSIX grep
අවශ්ය වන්නේ මූලික නිත්ය ප්රකාශන සමඟ වැඩ කිරීම සඳහා වන අතර, එම කාර්යය ඉටු කිරීම සඳහා ප්රමාණවත් තරම් බලවත් නොවේ (ඒවා සාමාන්ය භාෂාවන් විග්රහ කිරීමට හැකියාවක් නැත, විකල්පයක් නොමැති අතර වරහන් වර්ග නොමැති නිසා).
කෙසේ වෙතත් , GNU grep
එයට ඉඩ දෙන දිගු ක්රියාත්මක කරයි. විශේෂයෙන් ම, \|
BREs ක GNU ගේ ක්රියාත්මක කිරීම තුළ මලනවහ ක්රියාකරු වන අතර, \(
සහ \)
වරහන් වේ. ඔබේ නිත්ය ප්රකාශන එන්ජිම ප්රත්යාවර්ත, negative ණ වරහන් ප්රකාශන, වරහන් සහ ක්ලීන් තාරකාවට සහය දක්වන්නේ නම් සහ නූලෙහි ආරම්භයට හා අවසානයට නැංගුරම් දැමිය හැකි නම්, මෙම ප්රවේශය සඳහා ඔබට අවශ්ය වන්නේ එපමණකි. කෙසේ වෙතත් ඒවාට අමතරව negative ණාත්මක කට්ටල [^ ... ]
ඉතා පහසු බව සලකන්න , එසේ නොමැති නම්, ඔබ ඒවා (a|b|c| ... )
කට්ටලයේ නොමැති සෑම අක්ෂරයක්ම ලැයිස්තුගත කරන ආකෘතියේ ප්රකාශනයක් මගින් ප්රතිස්ථාපනය කළ යුතු අතර එය අතිශයින් වෙහෙසකර හා ඕනෑවට වඩා දිගු වන අතර ඊටත් වඩා එසේ නම් සම්පූර්ණ අක්ෂර කට්ටලය යුනිකෝඩ් වේ.
විධිමත් භාෂා න්යායට ස්තූතිවන්ත වන අතර, එවැනි ප්රකාශනයක් පෙනෙන්නේ කෙසේදැයි අපට දැකගත හැකිය. GNU සමඟ grep
, පිළිතුර පහත පරිදි වේ:
grep "^\([^h]\|h\(h\|eh\|edh\)*\([^eh]\|e[^dh]\|ed[^eh]\)\)*\(\|h\(h\|eh\|edh\)*\(\|e\|ed\)\)$" input
( ග්රේල් සමඟ හමු වූ අතර අතින් සාදන ලද තවත් ප්රශස්තිකරණ කිහිපයක්).
බැක්ස්ලෑෂ් ඉවත් කිරීම වැනි දීර් Regular නිත්ය ප්රකාශන ක්රියාත්මක කරන මෙවලමක් ද ඔබට භාවිතා කළ හැකිය 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
බලාපොරොත්තු වූ පරිදි.
විස්තර ගැන උනන්දුවක් දක්වන අය සඳහා, භාවිතා කරන තාක්ෂණය නම්, වචනයට ගැළපෙන නිත්ය ප්රකාශනය සීමිත ස්වයංක්රීය යන්ත්රයක් බවට පරිවර්තනය කිරීම, ඉන්පසු සෑම පිළිගැනීමේ තත්වයක්ම පිළිගැනීමට ලක් නොවන ලෙස වෙනස් කිරීමෙන් ස්වයංක්රීය යන්ත්රය හරවා යැවීම සහ පසුව ලැබෙන FA නැවත පරිවර්තනය කිරීම ය. නිත්ය ප්රකාශනයකි.
සෑම කෙනෙකුම සටහන් කර ඇති පරිදි, ඔබේ නිත්ය ප්රකාශන එන්ජිම negative ණාත්මක පෙනුමක් සඳහා සහය දක්වන්නේ නම්, සාමාන්ය ප්රකාශනය වඩා සරල ය. උදාහරණයක් ලෙස, GNU grep සමඟ:
grep -P '^((?!hede).)*$' input
කෙසේ වෙතත්, මෙම ප්රවේශයට අවාසියක් ඇත, එයට පසුගාමී නිත්ය ප්රකාශන එන්ජිමක් අවශ්ය වේ. මෙය RE2 වැනි ආරක්ෂිත නිත්ය ප්රකාශන එන්ජින් භාවිතා කරන ස්ථාපනයන්හි නුසුදුසු බවට පත් කරයි, මෙය සමහර තත්වයන් තුළ ජනනය කළ ප්රවේශයට වැඩි කැමැත්තක් දැක්වීමට එක් හේතුවකි.
පීඑච්පී හි ලියා ඇති කෙන්ඩල් හොප්කින්ස්ගේ විශිෂ්ට ෆෝමල් තියරි පුස්තකාලය, ග්රේල්ට සමාන ක්රියාකාරීත්වයක් සපයන අතර, මා විසින්ම ලියන ලද සරලකාරකයක් භාවිතා කරමින් , ආදාන වාක්ය ඛණ්ඩයක් ලබා දී ඇති negative ණ නිත්ය ප්රකාශනවල ඔන්ලයින් උත්පාදක යන්ත්රයක් ලිවීමට මට හැකි විය (අක්ෂරාංක හා අවකාශය පමණි අක්ෂර දැනට සහාය දක්වයි): 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?)?)?$
එය ඉහත දෙයට සමාන වේ.
([^h]*(h([^e]|$)|he([^d]|$)|hed([^e]|$)))*
කුමක්ද : ? අදහස සරලයි. අනවශ්ය නූලක ආරම්භය ඔබ දකින තුරු දිගටම ගැලපෙන්න, ඉන්පසු නූල නිම නොකළ N-1 අවස්ථාවන්හිදී පමණක් ගැලපෙන්න (මෙහි N යනු නූල් වල දිග වේ). මෙම N-1 නඩු "h පසුව ඊ නොවන", "ඔහු පසුව d නොවන" සහ "හෙඩ් පසුව ඊ නොවන" වේ. ඔබ මෙම N-1 නඩු සමත් වීමට සමත් වූවා නම්, ඔබ අනවශ්ය නූල් සමඟ සාර්ථකව නොගැලපෙන බැවින් ඔබට[^h]*
නැවත සෙවීම ආරම්භ කළ හැකිය