නැත විසින් ජනප්රිය උපුටා ජැමී Zawinski :
සමහර අය, ගැටලුවකට මුහුණ දෙන විට, "මම දනිමි, මම සාමාන්ය ප්රකාශන භාවිතා කරමි" යැයි සිතන්න. දැන් ඔවුන්ට ගැටළු දෙකක් තිබේ.
මෙම උපුටා දැක්වීම තේරුම් ගත යුත්තේ කෙසේද?
නැත විසින් ජනප්රිය උපුටා ජැමී Zawinski :
සමහර අය, ගැටලුවකට මුහුණ දෙන විට, "මම දනිමි, මම සාමාන්ය ප්රකාශන භාවිතා කරමි" යැයි සිතන්න. දැන් ඔවුන්ට ගැටළු දෙකක් තිබේ.
මෙම උපුටා දැක්වීම තේරුම් ගත යුත්තේ කෙසේද?
Answers:
සමහරක් වැඩසටහන් තාක්ෂණයන් වැඩසටහන්කරුවන් (විසින් හොඳින් අවබෝධ සාමාන්යයෙන් නොවේ සාමාන්ය ප්රකාශනයක , ඉපිලුම් ලක්ෂ්ය , perl බසට ලං , AWK , IOC ... සහ තවත් අය ).
නිවැරදි ගැටළු සමූහය විසඳීම සඳහා මේවා පුදුමාකාර ලෙස බලවත් මෙවලම් විය හැකිය. නිත්ය භාෂාවන් ගැලපීම සඳහා නිතිපතා ප්රකාශන ඉතා ප්රයෝජනවත් වේ. ගැටලුවේ හරය තිබේ: සාමාන්ය භාෂාවක් විස්තර කරන්නේ කෙසේදැයි ස්වල්ප දෙනෙක් දනිති (එය විහිළු සංකේත භාවිතා කරන පරිගණක විද්යා න්යායේ / වාග් විද්යාවේ කොටසකි - ඔබට ඒ ගැන චොම්ස්කි ධූරාවලියෙන් කියවිය හැකිය ).
මේ දේවල් සමඟ ගනුදෙනු කිරීමේදී, ඔබ ඒවා වැරදි ලෙස භාවිතා කරන්නේ නම්, ඔබ ඇත්ත වශයෙන්ම ඔබේ මුල් ගැටලුව විසඳා ඇතැයි සිතිය නොහැක. භාවිතා HTML ගැලපෙන ප්රකාශන (අ ඕනෑවට වඩා බහුලව සිදුවන) ඔබ අදහස් කරන ඇත අද්දර නඩු නැතුව පාලුයි. දැන්, ඔබ තවමත් විසඳා නැති මුල් ගැටළුව ඔබ සතුව ඇති අතර, ඒ වටා පාවෙන තවත් සියුම් දෝෂයක් හඳුන්වා දී ඇත්තේ වැරදි විසඳුමක් භාවිතා කරමිනි.
මින් අදහස් කරන්නේ නිත්ය ප්රකාශන භාවිතා නොකළ යුතු බව නොව, යමෙකුට විසඳිය හැකි ගැටළු මොනවාද යන්න තේරුම් ගැනීමට යමෙකු ක්රියා කළ යුතු අතර ඒවා විසඳීමට හා ඒවා යුක්තිසහගත ලෙස භාවිතා කිරීමට නොහැකි වීමයි.
මෘදුකාංග නඩත්තු කිරීමේ ප්රධාන දෙය නම් නඩත්තු කළ හැකි කේත ලිවීමයි. නිත්ය ප්රකාශන භාවිතා කිරීම එම ඉලක්කයට ප්රතිවිරුද්ධ විය හැකිය. සාමාන්ය ප්රකාශන සමඟ වැඩ කරන විට, ඔබ විශේෂ ඩොමේන් විශේෂිත භාෂාවකින් කුඩා පරිගණකයක් (නිශ්චිතවම නිර්ණය කළ නොහැකි සීමිත රාජ්ය ස්වයංක්රීය යන්ත්රයක් ) ලියා ඇත. මෙම භාෂාවෙන් 'හෙලෝ වර්ල්ඩ්' සමානව ලිවීම පහසු වන අතර ඒ පිළිබඳව මුලික විශ්වාසයක් ලබා ගත හැකිය, නමුත් තව දුරටත් ඉදිරියට යාම සාමාන්ය භාෂාව පිළිබඳ අවබෝධය සමඟ සංවර්ධනය කිරීම අවශ්ය වේ. ඒවා සාමාන්ය ප්රකාශනය පවතින වැඩසටහනේ කොටසක් නොවේ).
දැන් ඔබට නව ගැටලුවක් තිබේ; එය නිරාකරණය කිරීම සඳහා ඔබ නිත්ය ප්රකාශනයේ මෙවලම තෝරාගෙන ඇත (එය නුසුදුසු විට), ඔබට දැන් දෝෂ දෙකක් තිබේ, ඒ දෙකම සොයා ගැනීමට අපහසුය, මන්ද ඒවා වෙනත් වියුක්ත ස්ථරයක සැඟවී ඇති බැවිනි.
නිත්ය ප්රකාශන - විශේෂයෙන් සුළු නොවන ඒවා - කේත කිරීමට, තේරුම් ගැනීමට සහ නඩත්තු කිරීමට අපහසු විය හැකිය. ඔබ කළ යුතුව ඇත්තේ ස්ටැක් පිටාර ගැලීම ටැග් කර ඇති ප්රශ්න ගණන පමණි, [regex]
එහිදී ප්රශ්න කරන්නා ඔවුන්ගේ ගැටලුවට පිළිතුර රීජෙක්ස් යැයි උපකල්පනය කර පසුව හිර වී ඇත. බොහෝ අවස්ථාවන්හිදී ගැටළුව වෙනත් ආකාරයකින් විසඳිය හැකිය (සහ සමහර විට).
මෙයින් අදහස් කරන්නේ, ඔබ රීජෙක්ස් භාවිතා කිරීමට තීරණය කළහොත් ඔබට දැන් ගැටළු දෙකක් ඇති බවයි:
මූලික වශයෙන්, මම හිතන්නේ ඔහු අදහස් කරන්නේ ඔබ රීජෙක්ස් භාවිතා කළ යුත්තේ ඔබේ ගැටලුව විසඳීමට වෙනත් ක්රමයක් නොමැති නම් පමණක් බවයි. තවත් විසඳුමක් වන්නේ කේත කිරීම, නඩත්තු කිරීම සහ සහාය දීම පහසු වනු ඇත. එය මන්දගාමී හෝ අඩු කාර්යක්ෂමතාවයකින් යුක්ත විය හැකි නමුත් එය තීරණාත්මක නොවේ නම් නඩත්තු කිරීමේ පහසුකම සහ සහාය සැලකිය යුතු කරුණකි.
එය බොහෝ දුරට සත්යයේ ධාන්ය වර්ගයක් වුවද, කම්මුලට විහිළුවක්.
නිත්ය ප්රකාශන විශිෂ්ට සුදුසුකමක් වන කාර්යයන් කිහිපයක් තිබේ. මම වරක් අතින් ලියන ලද පුනරාවර්තන සම්භවයක් ඇති පේසර් කේත පේළි 500 ක් එක් නිත්ය ප්රකාශනයකින් ප්රතිස්ථාපනය කළෙමි. මිනිසුන් පවසන්නේ රීජෙක්ස් තේරුම් ගැනීමට සහ නිදොස්කරණය කිරීමට අපහසු නමුත් නිසි ලෙස යෙදූ ඒවා අතින් නිර්මාණය කරන ලද විශාල පාර්සලයක් ලෙස නිදොස්කරණය කිරීම තරම් අපහසු නොවන බවයි. මගේ උදාහරණයේ දී, රීජෙක්ස් නොවන විසඳුමේ සියලු දාර නිදොස් කිරීමට සති දෙකක් ගත විය.
කෙසේ වෙතත්, බෙන් මාමා:
විශාල ප්රකාශනයක් සහිතව විශාල වගකීමක් පැවරේ.
වෙනත් වචන වලින් කිවහොත්, රීජෙක්ස් ඔබේ භාෂාවට ප්රකාශන හැකියාව එක් කරයි, නමුත් එමඟින් යම් කාර්යයක් සඳහා වඩාත්ම කියවිය හැකි ප්රකාශන මාදිලිය තෝරා ගැනීමට ක්රමලේඛකයාට වැඩි වගකීමක් පැවරේ.
සමහර දේවල් මුලදී සාමාන්ය ප්රකාශන සඳහා හොඳ කාර්යයක් සේ පෙනේ, නමුත් එසේ නොවේ. උදාහරණයක් ලෙස, HTML වැනි කැදැලි ටෝකන සහිත ඕනෑම දෙයක්. සමහර විට සරල ක්රමයක් වඩාත් පැහැදිලි වන විට මිනිසුන් සාමාන්ය ප්රකාශනයක් භාවිතා කරයි. උදාහරණයක් ලෙස, string.endsWith("ing")
සමාන රීජෙක්ස් වලට වඩා තේරුම් ගැනීම පහසුය. සමහර විට මිනිසුන් විශාල ගැටළුවක් තනි රීජෙක්ස් බවට පත් කිරීමට උත්සාහ කරයි, එහිදී එය කැබලිවලට කැඩීම වඩාත් යෝග්ය වේ. සමහර විට මිනිසුන් සුදුසු වියුක්තයන් නිර්මාණය කිරීමට අපොහොසත් වන අතර, එකම කාර්යය කිරීම සඳහා හොඳින් නම් කරන ලද ශ්රිතයක් නිර්මාණය කරනවා වෙනුවට රීජෙක්ස් නැවත නැවතත් පුනරාවර්තනය කරයි (සමහර විට අභ්යන්තරව රීජෙක්ස් සමඟ ක්රියාත්මක වේ).
කිසියම් හේතුවක් නිසා, රීජෙක්ස් හි තනි වගකීම සහ ඩ්රයි වැනි සාමාන්ය මෘදුකාංග ඉංජිනේරු මූලධර්මවලට අන්ධ ස්ථානයක් නිර්මාණය කිරීමේ අමුතු ප්රවණතාවක් ඇත. ඔවුන්ට ආදරය කරන පුද්ගලයින් පවා ඇතැම් විට ඒවා ගැටළු සහගත වන්නේ එබැවිනි.
මෙම උපුටා දැක්වීම ගැන සාකච්ඡා කරන බ්ලොග් සටහනක ජෙෆ් ඇට්වුඩ් වෙනස් අර්ථකථනයක් ගෙන එයි: නිත්ය ප්රකාශන: දැන් ඔබට ගැටළු දෙකක් තිබේ ( සබැඳිය සඳහා යූෆොරික්ට ස්තූතියි )
මුල් 1997 ත්රෙඩ් එකේ ජේමිගේ පෝස්ට් වල සම්පූර්ණ පිටපත විශ්ලේෂණය කිරීමෙන් අපට පහත දේ සොයාගත හැකිය:
පර්ල්ගේ ස්වභාවය අනෙකුත් සියලුම ශිල්පීය ක්රම බැහැර කිරීම සඳහා නිත්ය ප්රකාශන භාවිතා කිරීම දිරිමත් කරයි; ඒවා දුර සිට දුරින් වඩාත් පැහැදිලිව පෙනෙන (අවම වශයෙන් වඩා හොඳ නොදන්නා අයට) A ලක්ෂ්යයේ සිට B දක්වා ලබා ගත හැකි ක්රමයක්.
පළමු උපුටා දැක්වීම බැරෑරුම් ලෙස සැලකිය නොහැකිය. නමුත් මෙය මම සම්පූර්ණයෙන්ම එකඟ වෙමි. ජේමි ඉදිරිපත් කිරීමට උත්සාහ කළ කාරණය මෙන්න: නිත්ය ප්රකාශන නපුරු බව නොවේ, නමුත් නිත්ය ප්රකාශන ඕනෑවට වඩා භාවිතා කිරීම නපුරකි.
ඔබ පවා නම් නෑ සාමාන්ය ප්රකාශනයක සම්පූර්ණයෙන්ම තේරුම් ගැනීමට ඔබ අමාරුවේ ගෝල්ඩන් හැමර් එය (ද බලන්න පහසු සහ නිරන්තරයෙන් කේතය සමඟ එකම දෙයක් කරන්න වැඩි පැහැදිලි වනු ඇත විට, සාමාන්ය ප්රකාශනයක සමඟ ගැටලුව විසඳීමට උත්සාහ, ප්රශ්නය Regex භාවිතය: CodingHorror එදිරිව රෙජෙක්ස් අපයෝජනය ).
උපුටා දැක්වීමේ සන්දර්භය දෙස බලන තවත් බ්ලොග් සටහනක් ඇත, එය ඇට්වුඩ්ට වඩා සවිස්තරාත්මකව දක්වයි: ජෙෆ්රි ෆ්රීඩ්ල්ගේ බ්ලොග් අඩවිය: සුප්රසිද්ධ “දැන් ඔබට ගැටලු දෙකක් තිබේ” උපුටා දැක්වීමේ මූලාශ්රය
මෙම උපුටා දැක්වීම සමඟ කරුණු කිහිපයක් සිදුවෙමින් පවතී.
මෙම උපුටා කලින් විහිළුවක් ක ෙල්ඛනගත කිරීම වේ:
ගැටලුවකට මුහුණ දෙන සෑම අවස්ථාවකම සමහර අය පවසන්නේ "AWK භාවිතා කරමු" කියාය. දැන් ඔවුන්ට ගැටළු දෙකක් තිබේ. - ඩී. ටිල්බ ro ක්
එය විහිළුවක් සහ සැබෑ කැණීමක් වන නමුත් එය වෙනත් නරක විසඳුම් සමඟ සම්බන්ධ කිරීමෙන් රීජෙක්ස් නරක විසඳුමක් ලෙස ඉස්මතු කිරීමේ ක්රමයකි. ඒක නියම හෙක් හයක් පමණයි .
මට නම් මතක තබා ගන්න, මෙම උපුටා දැක්වීම හිතාමතාම අර්ථ නිරූපණයට විවෘතය - අර්ථය කෙළින්ම ඉදිරියට ය. සාමාන්ය ප්රකාශනයක් භාවිතා කිරීමේ අදහස සරලව ප්රකාශ කිරීමෙන් ගැටළුව විසඳී නොමැත. ඊට අමතරව, ඔබ භාවිතා කරන ඕනෑම භාෂාවකට වඩා වෙනස් නීති රීති සමඟ අතිරේක භාෂාවක් එකතු කිරීමෙන් ඔබ කේතයේ සංජානන සංකීර්ණතාව වැඩි කර ඇත.
විහිළුවක් ලෙස විහිළුවක් වුවද, ඔබ රීජෙක්ස් නොවන විසඳුමක සංකීර්ණත්වය රීජෙක්ස් ද්රාවණයේ සංකීර්ණතාව හා සංසන්දනය කළ යුතුය. රීජෙක්ස් එකතු කිරීමේ අමතර පිරිවැය නොතකා, රීජෙක්ස් සමඟ ගැටළුවක් විසඳීම වටී.
RegularExpressionsarenoworsetoreadormaintainthananyotherunformattedcontent;
. ඔබට එය කළ හැකි බව නොදනී.)
මෙන්න සුළු උදාහරණයක්:
^(?:[^,]*+,){21}[^,]*+$
කෙසේ වෙතත් කියවීමට හෝ නඩත්තු කිරීමට එතරම් අපහසු නොවන නමුත් එය මේ ආකාරයට පෙනෙන විට වඩාත් පහසු වේ:
(?x) # enables comments, so this whole block can be used in a regex.
^ # start of string
(?: # start non-capturing group
[^,]*+ # as many non-commas as possible, but none required
, # a comma
) # end non-capturing group
{21} # 21 of previous entity (i.e. the group)
[^,]*+ # as many non-commas as possible, but none required
$ # end of string
එය ඉහළ මට්ටමේ උදාහරණයකි (අදහස් දැක්වීම අදහස් $
දැක්වීමට සමාන වේ i++
) නමුත් පැහැදිලිවම කියවීම, අවබෝධ කර ගැනීම සහ එය පවත්වාගෙන යාමේ කිසිදු ගැටළුවක් නොවිය යුතුය.
නිත්ය ප්රකාශන සුදුසු වන්නේ කවදාද යන්න සහ ඒවා නරක අදහසක් වන විට ඔබ ඒවා පැහැදිලි කර ඇති තාක් කල්, ඒවායේ කිසිදු වරදක් නොමැති අතර බොහෝ විට JWZ උපුටා දැක්වීම සැබවින්ම අදාළ නොවේ.
*+
කුමක්ද? එය යුක්තිසහගත ලෙස වෙනස් වන්නේ කෙසේද *
?
*+
මෙම නඩුවේ වචනාර්ථයෙන් කිසිදු තේරුමක් නැත ; සෑම දෙයක්ම නැංගුරම් ලා ඇති අතර ස්වයංක්රීය යන්ත්රයකින් 22 ක් දක්වා ගණනය කළ හැකි තනි පාස් එකකට ගැලපේ. කොමා නොවන කට්ටලවල නිවැරදි විකරණකාරකය යන්තම් පැරණි ය *
. (එපමණක්ද නොව, කෑදර හා කෑදර නොවන ගැලපෙන ඇල්ගොරිතම අතර කිසිදු වෙනසක් නොතිබිය යුතුය. එය අතිශය සරල අවස්ථාවකි.)
ක්රිස්එෆ්ගේ පිළිතුරට අමතරව - නිත්ය ප්රකාශන “කේත කිරීමට, තේරුම් ගැනීමට හා නඩත්තු කිරීමට අපහසුය”, ඊටත් වඩා නරක ය: ඒවා HTML වැනි තමන්ට කළ නොහැකි දේ විග්රහ කිරීමට ඒවා භාවිතා කිරීමට උත්සාහ කිරීමට මිනිසුන් පොළඹවන තරම් බලවත් ය. SO හි ඇති බොහෝ ප්රශ්න "මම HTML විග්රහ කරන්නේ කෙසේද?" නිදසුනක් වශයෙන්, සියලුම SO හි ඇති වඩාත්ම එපික් පිළිතුර !
නිතිපතා ප්රකාශන ඉතා බලවත් ය, නමුත් ඒවාට ඇත්තේ එක් කුඩා හා එක් විශාල ගැටලුවකි; ඒවා ලිවීමට අපහසු වන අතර කියවීමට අපහසුය.
හොඳම අවස්ථාවෙහිදී නිත්ය ප්රකාශනය භාවිතා කිරීම ගැටළුව විසඳයි, එබැවින් ඔබට ඇත්තේ සංකීර්ණ කේතයේ නඩත්තු ගැටළුව පමණි. ඔබට නිත්ය ප්රකාශනය නිවැරදිව නොලැබුනේ නම්, ඔබට මුල් ගැටළුව සහ කියවිය නොහැකි කේතයේ ගැටළුව යන දෙකම ක්රියාත්මක වේ.
සමහර විට සාමාන්ය ප්රකාශන ලිවීමට පමණක් කේතය ලෙස හැඳින්වේ. නිවැරදි කිරීම අවශ්ය නිත්ය ප්රකාශනයකට මුහුණ දී ඇති අතර, ප්රකාශනය තේරුම් ගැනීමට උත්සාහ කරනවාට වඩා මුල සිටම ආරම්භ කිරීම වේගවත් වේ.
ගැටළුව වන්නේ රීජෙක්ස් යනු සංකීර්ණ තිරිසනෙකු වන අතර, ඔබ ඔබේ ගැටලුව විසඳන්නේ ඔබ රීජෙක්ස් පරිපූර්ණ ලෙස භාවිතා කරන්නේ නම් පමණි. ඔබ එසේ නොකරන්නේ නම්, ඔබ ගැටළු 2 කින් අවසන් වේ: ඔබේ මුල් ගැටලුව සහ රීජෙක්ස්.
ඔබට පේළි සියයක වැඩ කළ හැකි බව ඔබ කියා සිටියත්, රීජෙක්ස් පේළියකට වඩා පැහැදිලි, සංක්ෂිප්ත කේත පේළි 100 ක් හොඳ යැයි ඔබට තර්ක කළ හැකිය.
ඔබට මේ පිළිබඳ යම්කිසි සාක්ෂියක් අවශ්ය නම්: ඔබට මෙම SO ක්ලැසික් පරීක්ෂා කළ හැකිය. නැතහොත් SO Regex Tag හරහා පනාව
අර්ථයට කොටස් දෙකක් ඇත:
2014 දී ඔබ එය ඉල්ලා සිටින විට, වර්තමාන සන්දර්භය හා සසඳන විට 1997 සන්දර්භයේ ක්රමලේඛන භාෂා මතවාද කෙරෙහි අවධානය යොමු කිරීම සිත්ගන්නා සුළු වනු ඇත. මම මෙහි මෙම විවාදයට ඇතුළු නොවෙමි, නමුත් පර්ල් සහ පර්ල් පිළිබඳ මතයන් බොහෝ සෙයින් වෙනස් වී ඇත.
කෙසේ වෙතත්, 2013 සන්දර්භය තුළ රැඳී සිටීම සඳහා ( de l'eau a coulé sous les ponts depuis ), ජේමි සැවින්ස්කිගේ සෘජු උපුටා දැක්වීමක් වන සුප්රසිද්ධ XKCD විකට චිත්රයක් භාවිතා කරමින් උපුටා දැක්වීම් නැවත ප්රතිනිර්මාණය කිරීම කෙරෙහි අවධානය යොමු කිරීමට මම යෝජනා කරමි :
එය Zawinski උපුටා සැඳහුම, නිසා මුලින්ම මම මේ හාස්ය තේරුම් ගැනීමට ගැටලු ඇති හා එය ජේ-z, ගීතය රචනා උපුටා, සහ GNU ආශ්රිත program --help -z
ධජය 2 , ඉතින්, ඒ තරම් සංස්කෘතිය මට එය තේරුම් ගැනීමට විය.
එය විනෝදජනක බව මම දැන සිටියෙමි, මට එය දැනේ, නමුත් එයට හේතුව මම නොදනිමි. මිනිසුන් බොහෝ විට පර්ල් සහ රීජෙක්ස් ගැන විහිළු කරයි, විශේෂයෙන් එය හිප්ස්ටෙස්ට් ක්රමලේඛන භාෂාව නොවන බැවින්, එය විනෝදජනක විය යුත්තේ මන්දැයි නොදනී ... සමහර විට පර්ල් මොන්ගර්වරු මෝඩ දේවල් කරන නිසා විය හැකිය.
එබැවින් ආරම්භක උපුටා දැක්වීම සිත් රිදවන මෙවලම් සමඟ ක්රමලේඛනය කිරීම නිසා ඇති වන සැබෑ ජීවිත ගැටලු (වේදනාව?) මත පදනම් වූ උපහාසාත්මක විහිළුවක් ලෙස පෙනේ. මිටියක් පෙදරේරුවෙකුට රිදවිය හැකි සේම, මෙවලම් සමඟ ක්රමලේඛනය කිරීම, සංවර්ධකයෙකුට රිදවිය හැකි නම් (මොළය, හැඟීම්) තෝරා ගත හැකි මෙවලම් නොවේ. සමහර විට, වඩාත්ම සුදුසු මෙවලම කුමක්ද යන්න පිළිබඳව විශාල විවාද සිදු වේ, නමුත් එය බොහෝ දුරට නිෂ් less ල හේතුව එය ඔබේ රසය හෝ ඔබේ ක්රමලේඛන කණ්ඩායමේ රසය , සංස්කෘතික හෝ ආර්ථික හේතූන් ය. මේ පිළිබඳ තවත් විශිෂ්ට XKCD විකට චිත්රයක්:
රීජෙක්ස් ගැන මිනිසුන්ට දැනෙන වේදනාව මට තේරුම් ගත හැකි අතර, රීජෙක්ස් නිර්මාණය කර ඇති දේ සඳහා තවත් මෙවලමක් වඩාත් සුදුසු යැයි ඔවුන් විශ්වාස කරයි. @ Karl-bielefeldt ඔබේ ප්රශ්නයට ඉතා ප්රකාශිත ලෙස පිළිතුරු දෙන විට විශාල වගකීමක් පැවරෙන අතර රීජෙක්ස් විශේෂයෙන් මේ ගැන සැලකිලිමත් වේ. සංවර්ධකයෙකු ඔහු රීජෙක්ස් සමඟ ගනුදෙනු කරන්නේ කෙසේද යන්න ගැන තැකීමක් නොකරන්නේ නම්, එය පසුව කේතය නඩත්තු කරන පුද්ගලයින්ට වේදනාවක් වනු ඇත.
ඩේමියන් කොන්ව්ගේ පර්ල් හොඳම පරිචයන් (2005 පොතක්) වෙතින් සාමාන්ය උදාහරණයක් පෙන්වන උපුටා දැක්වීමකින් උපුටා දැක්වීම් ප්රතිනිර්මාණය කිරීම පිළිබඳ මෙම පිළිතුරෙන් මම අවසන් කරමි .
මෙවැනි රටාවක් ලිවීම ඔහු පැහැදිලි කරයි :
m{'[^\\']*(?:\\.[^\\']*)*'}
... මෙවැනි වැඩසටහනක් ලිවීමට වඩා පිළිගත නොහැකි ය :
sub'x{local$_=pop;sub'_{$_>=$_[0
]?$_[1]:$"}_(1,'*')._(5,'-')._(4
,'*').$/._(6,'|').($_>9?'X':$_>8
?'/':$")._(8,'|').$/._(2,'*')._(
7,'-')._(3,'*').$/}print$/x($=).
x(10)x(++$x/10).x($x%10)while<>;
නමුත් එය නැවත ලිවිය හැකිය , එය තවමත් ලස්සන නැත, නමුත් අවම වශයෙන් එය දැන් නොනැසී පවතී.
# Match a single-quoted string efficiently...
m{ ' # an opening single quote
[^\\']* # any non-special chars (i.e., not backslash or single quote)
(?: # then all of...`
\\ . # any explicitly backslashed char
[^\\']* # followed by any non-special chars
)* # ...repeated zero or more times
' # a closing single quote
}x
හතරැස් හැඩයෙන් යුක්ත කේතය මේ ආකාරයේ වන දෙවන ප්රශ්නය regexes නොව, පැහැදිලි නඩත්තු කළහැකි, කියවිය හැකි ආකාරයෙන් සංයුති කල හැකි බව.
/* Multiply the first 10 values in an array by 2. */ for (int i = 0 /* the loop counter */; i < 10 /* continue while it is less than 10 */; ++i /* and increment it by 1 in each iteration */) { array[i] *= 2; /* double the i-th element in the array */ }
පරිගණක විද්යාවෙන් ඔබ ඉගෙන ගත යුතු එක් දෙයක් තිබේ නම් එය චොම්ස්කි ධූරාවලියයි . නිත්ය ප්රකාශනවල ඇති සියලුම ගැටලු පැමිණෙන්නේ සන්දර්භය රහිත ව්යාකරණ විග්රහ කිරීමට ගත් උත්සාහයන් නිසා යැයි මම කියමි. සීඑෆ්ජී හි කූඩු මට්ටම් සඳහා ඔබට සීමාවක් පැනවිය හැකි විට (හෝ ඔබට සීමාවක් පැනවිය හැකි යැයි සිතන විට), ඔබට දිගු හා සංකීර්ණ නිත්ය ප්රකාශන ලැබේ.
නිත්ය ප්රකාශන පූර්ණ පරිමාණයේ විග්රහ කිරීමට වඩා ටෝකනකරණය සඳහා වඩාත් සුදුසු වේ.
එහෙත්, ක්රමලේඛකයන්ට විග්රහ කිරීමට අවශ්ය පුදුම සහගත විශාල දේවල් සමූහයක් සාමාන්ය භාෂාවකින් විග්රහ කළ හැකිය (නැතහොත්, වඩාත් නරක, සාමාන්ය භාෂාවෙන් විග්රහ කළ හැකි අතර ඔබ තව ටිකක් කේතයක් ලිවුවහොත් ...).
එබැවින් "ආහා, මට පෙළ වෙන්කර ගැනීමට අවශ්යයි, මම නිත්ය ප්රකාශනයක් භාවිතා කරමි" යනුවෙන් පුරුදු වී සිටින්නේ නම්, එම මාර්ගයෙන් බැසීම පහසුය, ඔබට තල්ලු-ස්වයංක්රීය ස්වයංක්රීය යන්ත්රයකට, සීඑෆ්ජී පාර්සර් හෝ වෙනත් යමක් අවශ්ය වූ විට ඊටත් වඩා ප්රබල ව්යාකරණ. එය සාමාන්යයෙන් කඳුළු වලින් අවසන් වේ.
ඉතින්, මම හිතන්නේ උපුටා දැක්වීම රීජෙක්ස් වලට එතරම් කම්මැලි නොවේ, ඒවායේ භාවිතය ඇත (සහ හොඳින් භාවිතා කර ඇත, ඒවා ඇත්තෙන්ම ඉතා ප්රයෝජනවත් වේ), නමුත් රීජෙක්ස් මත අධික ලෙස රඳා පැවතීම (හෝ, විශේෂයෙන්, ඒවා විවේචනාත්මකව තෝරා ගැනීම) .
jwz එම උපුටා දැක්වීම සමඟ ඔහුගේ රොකර් එකෙන් ඉවතට. නිත්ය ප්රකාශන ඕනෑම භාෂා අංගයකට වඩා වෙනස් නොවේ - ඉස්කුරුප්පු කිරීම පහසුය, අලංකාර ලෙස භාවිතා කිරීමට අපහසුය, විටෙක බලවත්ය, විටෙක නුසුදුසුය, බොහෝ විට හොඳින් ලේඛනගත කර ඇත, බොහෝ විට ප්රයෝජනවත් වේ.
පාවෙන ලක්ෂ්ය අංක ගණිතය, වසා දැමීම්, වස්තු-දිශානතිය, අසමමුහුර්ත I / O හෝ ඔබට නම් කළ හැකි වෙනත් ඕනෑම දෙයකට මෙයම කිව හැකිය. ඔබ කරන්නේ කුමක්දැයි ඔබ නොදන්නේ නම්, ක්රමලේඛන භාෂාවන් ඔබව දුකට පත් කළ හැකිය.
රීජෙක්ස් කියවීමට අපහසු යැයි ඔබ සිතන්නේ නම්, සැක සහිත රටාව පරිභෝජනය කිරීම සඳහා සමාන විග්රහයක් ක්රියාත්මක කිරීම කියවීමට උත්සාහ කරන්න. බොහෝ විට රීජෙක්ස් දිනන්නේ ඒවා සම්පූර්ණ පාර්සර් වලට වඩා සංයුක්ත බැවින් ... සහ බොහෝ භාෂාවල ඒවා වේගවත් වේ.
ස්වයං ප්රවර්ධන බ්ලොග්කරුවෙකු සුදුසුකම් නොලත් ප්රකාශ කරන බැවින් නිත්ය ප්රකාශන (හෝ වෙනත් භාෂා අංගයක්) භාවිතා කිරීමෙන් වළකින්න. ඔබ වෙනුවෙන් දේවල් අත්හදා බලා ඔබට වැඩ කරන්නේ කුමක්දැයි බලන්න.
අභ්යන්තර ගූගල් කේත සටහනකින් ප්රතිනිෂ්පාදනය කරන ලද බ්ලොග් සටහනක සුප්රසිද්ධ රොබ් පයික් විසින් මේ සඳහා මගේ ප්රියතම, ගැඹුරු පිළිතුර ලබා දී ඇත: http://commandcenter.blogspot.ch/2011/08/regular-expressions-in-lexing- and.html
සාරාංශය නම් , ඒවා නරක නොවන බව නොවේ , නමුත් ඒවා බොහෝ විට භාවිතා කරනුයේ ඒවා අනිවාර්යයෙන්ම නොගැලපෙන කාර්යයන් සඳහාය, විශේෂයෙන් යම් ආදානයක් ලිහිල් කිරීම හා විග්රහ කිරීම සම්බන්ධයෙන්.
නිත්ය ප්රකාශන ලිවීමට අපහසුය, හොඳින් ලිවීමට අපහසුය, සහ වෙනත් තාක්ෂණයන්ට සාපේක්ෂව මිල අධික විය හැකිය ... අනෙක් අතට, ලෙක්සර්ස් නිවැරදිව ලිවීමට තරමක් පහසුය (සංයුක්ත නොවේ නම්), සහ පරීක්ෂා කිරීමට ඉතා පහසුය. අක්ෂරාංක හඳුනාගැනීම් සොයා ගැනීම සලකා බලන්න. Regexp ("[a-ZA-Z _] [a-ZA-Z_0-9] *" වැනි දෙයක්) ලිවීම එතරම් අපහසු නැත, නමුත් සරල ලූපයක් ලෙස ලිවීමට එතරම් අපහසු නොවේ. කෙසේ වෙතත්, ලූපයේ ක්රියාකාරිත්වය වඩා ඉහළ අගයක් ගන්නා අතර ආවරණ යටතේ අඩු කේතයක් ඇතුළත් වේ. සාමාන්ය ප්රකාශන පුස්තකාලයක් යනු විශාල දෙයකි. හඳුනාගැනීම් විග්රහ කිරීම සඳහා එකක් භාවිතා කිරීම හරියට කිරි සඳහා ගබඩාවට යාමට ෆෙරාරි භාවිතා කිරීම වැනිය.
ඔහු ඊට වඩා බොහෝ දේ පවසයි, නිත්ය ප්රකාශන ප්රයෝජනවත් යැයි තර්ක කරයි, උදා: පෙළ සංස්කාරකවරුන්ගේ රටාවන් ඉවත දැමිය හැකි නමුත් ඒවා සම්පාදනය කරන ලද කේත වල කලාතුරකින් භාවිතා කළ යුතුය. එය කියවීම වටී.
මෙය ඇලන් පර්ලිස්ගේ අභිලේඛනය # 34 හා සම්බන්ධ වේ:
මෙම නූල සම්පූර්ණයෙන්ම දත්ත ව්යුහයක් වන අතර එය සම්මත වූ සෑම තැනකම ක්රියාවලියේ බොහෝ අනුපිටපත් ඇත. තොරතුරු සැඟවීමට එය කදිම වාහනයකි.
එබැවින් ඔබ ඔබේ දත්ත ව්යුහය ලෙස අක්ෂර මාලාව තෝරා ගන්නේ නම් (සහ, එය හැසිරවීමට ඇල්ගොරිතම ලෙස ස්වාභාවිකවම රීජෙක්ස් මත පදනම් වූ කේතය), එය ක්රියාත්මක වුවද ඔබට ගැටළුවක් ඇත: දත්ත නුසුදුසු ලෙස නිරූපණය කිරීම වටා ඇති නරක නිර්මාණය දිගු කිරීම සහ අකාර්යක්ෂම කිරීම.
කෙසේ වෙතත්, බොහෝ විට එය ක්රියා නොකරයි: මුල් ගැටළුව විසඳී නැත, එබැවින් ඔබට ගැටළු දෙකක් තිබේ.
ඉක්මන් හා අපිරිසිදු පෙළ විග්රහ කිරීම සඳහා රීජෙක්ස් බහුලව භාවිතා වේ. ඒවා සරල නූල් ගැළපුමකට වඩා ටිකක් සංකීර්ණ රටා ප්රකාශ කිරීම සඳහා විශිෂ්ට මෙවලමකි.
කෙසේවෙතත්, රිජෙක්ස් වඩාත් සංකීර්ණ වන විට සර්වරල් ගැටළු ඔවුන්ගේ හිස ඔසවයි.
මේ අනුව, පෙළ සැකසීමේ ගැටලුවකින් ආරම්භ කිරීම, ඒ සඳහා නිත්ය ප්රකාශන යෙදීම සහ ගැටලු දෙකකින් අවසන් වීම, ඔබ විසඳීමට උත්සාහ කළ මුල් ගැටළුව සහ විසඳීමට උත්සාහ කරන නිත්ය ප්රකාශන සමඟ කටයුතු කිරීම (නමුත් නිවැරදිව විසඳීම නොවේ) මුල් ගැටළුව.