තමාටම ගැලපෙන රීජෙක්ස්


345

රීජෙක්ස් ( ස්වයං-ගැලපෙන රීජෙක්ස් , රීජෙක්ස් වලංගු කරන රීජෙක්ස් ) සම්බන්ධ ලස්සන අභියෝග කිහිපයක් තිබේ.

මෙය කළ නොහැකි දෙයක් විය හැකි නමුත්, එයට ගැලපෙන රීජෙක්ස් එකක් තිබේද?

සටහන, පරිසීමක ඇතුළත් කළ යුතුය:

උදාහරණයක් ලෙස /thing/ගැලපිය යුතුයි /thing/නොව thing. ඔබේ ප්‍රකාශනය සඳහා ඇති එකම ගැලපීම ප්‍රකාශනයම විය යුතුය. නිත්‍ය ප්‍රකාශනයක් වෙනුවට නූලක් ක්‍රියාත්මක කිරීමට බොහෝ භාෂා ඉඩ දෙයි. උදාහරණයක් ලෙස Go හි

package main

import "fmt"
import "regexp"

func main() {

    var foo = regexp.MustCompile("bar")
    fmt.Println(foo.MatchString("foobar"))
}

නමුත් අභියෝගය වෙනුවෙන්, ප්‍රකාශනය වෙන් කිරීමට ඉඩ දෙන්න (ආරම්භක සංකේතය, ප්‍රකාශනය, අවසන් සංකේතය ex: /fancypantpattern/හෝ @[^2048]@), ඔබේ පරිසීමකය ලෙස උපුටා දැක්වීම් කිරීමට ඔබට අවශ්‍ය නම්, එසේ වන්න. මම හිතන්නේ මෙම ගැටලුවේ පෙනෙන දුෂ්කරතාවය නිසා එය විශාල වෙනසක් නොකරනු ඇත.

ඔබට උදව් කිරීමට:

Rubular.com (රූබි රීජෙක්ස් සංස්කරණය සඳහා වෙබ් පිටුවක්) සඳහා මම ඉක්මන් හැක් කිරීම:

var test = document.getElementById("test")
,regex = document.getElementById("regex")
,delimiter="/"
,options = document.getElementById("options")
,delay = function(){test.value = delimiter + regex.value + delimiter + options.value}
,update = function(e){
    // without delay value = not updated value
    window.setTimeout(delay,0);
}
regex.onkeydown = update;
options.onkeydown = update;

මෙය තාක්‍ෂණිකව 'කේත ගොල්ෆ්' වුවද, ඕනෑම කෙනෙකුට පිළිතුරක් සොයාගත හැකි නම් / එය කළ නොහැකි බව ඔප්පු කළ හැකි නම් මා පුදුමයට පත් වනු ඇත.

සබැඳිය දැන් සවි කර ඇත. සැමට සමාවෙන්න

මෙතෙක් ජයග්‍රාහී පිළිතුර: අක්ෂර 40 ක් සහිත ජිමී 23013


3
නිසැකවම වචනානුසාරයෙන් පමණක් ඇතුළත් වන ඕනෑම නිත්‍ය ප්‍රකාශනයක් ක්‍රියාත්මක වනු ඇත: //, / a /, / xyz /, ආදිය. රීජෙක්ස් වචනානුසාර නොවන මෙහෙයුමක් ඇතුළත් කිරීම අවශ්‍ය වීම හොඳ විය හැකිය.
පාන් පෙට්ටිය

9
සාක්ෂරතාවන් ක්‍රියා නොකරන්නේ ඔබට බැක්ස්ලෑෂ් aaa
ගැලපීමට අවශ්‍ය

2
YdylanMadisetti අපට //පරිසීමක භාවිතා කළ යුතුද, නැතහොත් අපට වෙනත් පරිසීමක තෝරා ගත හැකිද (PCRE ඕනෑම අක්‍ෂරයකට සහය දක්වයි, විශේෂයෙන් ඔබට ගැලපෙන වරහන් / වරහන් / වරහන් පරිසීමක ලෙස භාවිතා කළ හැකිය).
මාටින් එන්ඩර්

3
මම හිතන්නේ මෙය තරමක් හොඳ ගණිතමය / පරිගණකමය ගැටළුවක් වන අතර සාධනය පහසු නොවිය හැකිය ... බොහෝ වැදගත් ප්‍රමේයයන් ආරම්භ වූයේ සරල ප්‍රශ්නයක් සමඟ සෙල්ලම් කිරීමටය, එබැවින් සමහර විට වසර 5 කින් විකිපීඩියා ලිපිය "මැඩිසෙට්ටි ගැටලුව" ඇත;)
Paweł Tokarz

3
ඔව්, හරියටම. සමහර භාෂාවල (grep in bash යැයි සිතන්න) පරිසීමකය අත්‍යවශ්‍යයෙන්ම හිස් නූලකි. එබැවින් regexp ට පරිසීමක අවශ්‍ය යැයි උපකල්පනය කිරීම දැනටමත් වැරදිය. ඇත්ත වශයෙන්ම, ග්‍රෙප් යනු රීජෙක්ස්පී හි මුල්ම ක්‍රියාත්මක කිරීම වන බැවින් රීජෙක්ස්පී හි කැනොනිකල් අර්ථ දැක්වීමෙහි පරිසීමක නොමැත. මෙම උපකල්පනයේ වැරදි ප්‍රකාශනය වන්නේ පරිසීමක දෙකක් අවශ්‍ය වන PHP ය: "/සහ/"
slebetman

Answers:


601

PCRE රසය, 261 289 210 184 127 109 71 53 51 44 40 බයිට්

ඔව්, එය කළ හැකිය!

<^<()(?R){2}>\z|\1\Q^<()(?R){2}>\z|\1\Q>

එය මෙහි උත්සාහ කරන්න. (නමුත් /Regex101 හි පරිසීමකය ලෙස දැක්වේ.)

කරුණාකර Regex101 පිටුවේ අනවශ්‍ය සංස්කරණයන් (යාවත්කාලීන කිරීම්) කිරීමෙන් වළකින්න. ඔබේ සංස්කරණයට ඇත්ත වශයෙන්ම මෙම රීජෙක්ස් වැඩි දියුණු කිරීම, උත්සාහ කිරීම හෝ පරීක්ෂා කිරීම ඇතුළත් නොවේ නම්, ඔබට එය දෙබලක තැබීමට හෝ ඔවුන්ගේ මුල් පිටුවෙන් නව ඒවා නිර්මාණය කිරීමට හැකිය .

අනුවාදය Regex101 (බයිට් 44) මත වඩාත් නිවැරදිව ක්‍රියා කරයි:

/^\/()(?R){2}\/\z|\1\Q^\/()(?R){2}\/\z|\1\Q/

එය මෙහි උත්සාහ කරන්න.

මෙය මුල් අනුවාදයට වඩා බෙහෙවින් සරල වන අතර සාම්ප්‍රදායික ක්වයින් වැනි වැඩ කරයි. එය නූල් භාවිතා නොකර නිර්වචනය කිරීමට උත්සාහ කරන අතර එය වෙනත් ස්ථානයක භාවිතා කරයි. එබැවින් එය රීජෙක්ස් හි එක් කෙළවරකට ඉතා ආසන්නව තැබිය හැකිය, ගැලපෙන රටාව නිර්වචනය කිරීම සඳහා වැඩි අක්ෂර අවශ්‍ය වන චරිත ගණන අඩු කිරීම සහ වැඩි වාර ගණනක් පුනරාවර්තනය කිරීම.

පැහැදිලි කිරීම්:

  • \Q^\/()(?R){2}\/\z|\1\Qනූලට ගැලපේ ^\/()(?R){2}\/\z|\1\Q. මෙය \Q...\Eවසා දැමිය යුතු නොවන විචක්ෂණතාවයක් භාවිතා කරන අතර , අනාරක්ෂිත පරිසීමක ක්‍රියා කරයි \Q. මෙමඟින් පෙර සංස්කරණ ක්‍රියාත්මක වූයේ Regex101 මත පමණක් වන අතර එය දේශීයව නොවේ. නමුත් වාසනාවකට මෙන් නවතම අනුවාදය ක්‍රියාත්මක වූ අතර මම මෙය භාවිතා කරමින් තවත් බයිට් කිහිපයක් ඉවත් කළෙමි.
  • \1\Qඅල්ලා ගත් කණ්ඩායමට ගැලපීමට පෙර 1. මෙම විකල්පය තුළ 1 වන කාණ්ඩය නොපවතින බැවින්, එය ගැලපෙන්නේ පුනරාවර්තන ඇමතුම් වල පමණි. පුනරාවර්තන ඇමතුම් වලදී එය හිස් නූල් වලට ගැලපේ.
  • (?R){2}මුළු රිජෙක්ස් එක දෙවරක් පුනරාවර්තන ලෙස අමතයි, එය ^\/()(?R){2}\/\z|\1\Qඑක් එක් කාලයට ගැලපේ .
  • () 1 වන කාණ්ඩයට හිස් නූලක් අල්ලා ගැනීම හැර වෙන කිසිවක් නොකරයි, එමඟින් පුනරාවර්තන ඇමතුම් වල අනෙක් විකල්පය සක්‍රීය කරයි.
  • ^\/()(?R){2}\/\z(?R){2}ආරම්භයේ සිට අවසානය දක්වා එකතු කරන ලද පරිසීමක සමඟ ගැලපීම් . මෙම \/ද එය වැල මුල දී වනු ඇත නිසා වග බලා ගන්න මෙම විකල්පය ම, ආවර්තනික ඇමතුම් තුළ නොගැලපේ ලද ආවර්තනික ඇමතුම් පෙර.

සංවෘත බයිට් 51 ක් \Q...\E:

/\QE\1|^\/(\\)Q(?R){2}z\/\E\1|^\/(\\)Q(?R){2}z\/\z/

එය මෙහි උත්සාහ කරන්න.

මුල් අනුවාදය, බයිට් 188 යි

බයිට් 100 ක් පමණ ගොල්ෆ් කිරීම ගැන මාටින් බොට්නර්ට ස්තූතියි!

/^(?=.{173}\Q\2\)){2}.{11}$\E\/\z)((?=(.2.|))\2\/\2\^\2\(\2\?=\2\.\2\{173}\2\\Q\2\\2\2\\\2\)\2\)\2\{2}\2\.\2\{11}\2\$\2\\E\2\\\2\/\2\\z\2\)\2\(\2\(\2\?=\2\(\2\.2\2\.\2\|\2\)\2\)){2}.{11}$/

එය මෙහි උත්සාහ කරන්න.

හෝ නැතිව බයිට් 210 \Q...\E:

/^(?=.{194}\\2\\.\)\{2}\.\{12}\$\/D$)((?=(.2.|))\2\/\2\^\2\(\2\?=\2\.\2\{194}\2\\\2\\2\2\\\2\\\2\.\2\\\2\)\2\\\2\{2}\2\\\2\.\2\\\2\{12}\2\\\2\$\2\\\2\/D\2\$\2\)\2\(\2\(\2\?=\2\(\2\.2\2\.\2\|\2\)\2\)){2}.{12}$/D

එය මෙහි උත්සාහ කරන්න.

පුළුල් කළ අනුවාදය:

/^(?=.{173}\Q\2\)){2}.{11}$\E\/\z)        # Match things near the end.
((?=(.2.|))                               # Capture an empty string or \2\ into group 2.
   \2\/\2\^\2\(\2\?=\2\.\2\{173}\2\\Q\2\\2\2\\\2\)\2\)\2\{2}\2\.
   \2\{11}\2\$\2\\E\2\\\2\/\2\\z\2\)      # 1st line escaped.
   \2\(\2\(\2\?=\2\(\2\.2\2\.\2\|\2\)\2\) # 2nd line escaped.
){2}
.{11}$/x

වැනි දිගු (?=හා \1ද quines හැකි වන කරයි, තවදුරටත් විධිමත් ඊනියා "සාමාන්ය" ප්රකාශන කර ඇත. පසු විපරම නිත්‍ය නොවේ, නමුත් බැලූ බැල්මට පෙනේ.

පැහැදිලි කිරීම:

  • මම භාවිතා \2\වෙනුවට \විශේෂ අක්ෂර පැන. නම් \2තරග හිස් නූල්, \2\x(එහිදී xවිශේෂ චරිතයක්) එම තරග xම. නම් \2තරග \2\, \2\xබේරී එක් තරග. \21 වන කාණ්ඩයේ තරඟ දෙකෙහිදී රීජෙක්ස් හි වෙනස් විය හැකිය. පළමු වරට \2හිස් නූලට අනුරූප විය යුතු අතර දෙවන වරට \2\.
  • \Q\2\)){2}.{11}$\E\/\z(1 වන පේළිය) අවසානයේ සිට අක්ෂර 15 කට ගැලපේ. සහ .{11}$(7 වන පේළිය) අවසානයේ සිට අක්ෂර 11 ක් ගැලපේ (හෝ පසුපස නව රේඛාවකට පෙර). එබැවින් දෙවන රටාවට පෙර රටාව පළමු රටාවේ පළමු අක්ෂර 4 හෝ 3 ට අනුරූප \2\.\2\|\2\)\2\)විය යුතුය , එබැවින් ගැලපිය යුතුය ...\2\)හෝ ...\2\. අන්තිම චරිතය විය යුතු නිසා පසුපස නව රේඛාවක් තිබිය නොහැක ). ගැලපෙන පා text )යේ දකුණු පසට පෙර තවත් එකක් අඩංගු නොවේ , එබැවින් අනෙක් සියලුම අක්ෂර තිබිය යුතුය \2. \2ලෙස අර්ථ දක්වා ඇති (.2.|)බැවින් එය විය හැක්කේ එය පමණි \2\.
  • සෑම දෙයක්ම ස්ථාවර දිගක් ඇති බැවින් පළමු පේළියේ මුළු ප්‍රකාශනයම අක්ෂර 188 ට ගැලපේ. 1 වන කාණ්ඩයේ දෙවරක් අක්ෂර 45 * 2 ක් සහ 29 වතාවක් ගැලපේ \2. 1 වන කාණ්ඩයට පසුව ඇති දේවල් අක්ෂර 11 ට ගැලපේ. එබැවින් වාර දෙකේ මුළු දිග \2හරියටම අක්ෂර 3 ක් විය යුතුය. \2දෙවන වරට දැන ගැනීම අක්ෂර 3 ක් දිග වන අතර එය පළමු වරට හිස් විය යුතුය.
  • බැලූ බැල්මට හැර අනෙක් සියල්ල \21 වන කාණ්ඩයේ වචනාර්ථයන් වේ. දෙවරක් \2දන්නා සහ පළමු පේළියේ සිට දන්නා අවසාන අක්ෂර කිහිපය සමඟ මෙම රීජෙක්ස් හරියටම එක් නූලකට ගැලපේ.
  • මාටින් බොට්නර්ගේ අදහස වන්නේ 2 වන කණ්ඩායම අල්ලා ගැනීමට සහ එය ක්වයින් කොටස සමඟ අතිච්ඡාදනය කිරීමට ලුක්හෙඩ් භාවිතා කිරීමයි. මෙමඟින් 1 වන කාණ්ඩයේ අවස්ථා දෙක අතර සාමාන්‍ය ආකාරයෙන් ගැලවී නොතිබූ අතර මගේ මුල් අනුවාදයට ගැලපෙන රටාව වළක්වා ගැනීමට උපකාරී වන අතර රීජෙක්ස් බොහෝ සරල කළේය.

පුනරාවර්තන හෝ පසු විපරම් නොමැතිව රීජෙක්ස්, බයිට් 85 ක්

පුනරාවර්තන හෝ පසු විපරම් සහිත ප්‍රකාශන සැබෑ “නිත්‍ය” ප්‍රකාශන නොවන බව යමෙකු තර්ක කළ හැකිය. සාම්ප්‍රදායික නිත්‍ය ප්‍රකාශන මගින් ප්‍රකාශ කළ හොත් ඒවා වඩා දිගු විය හැකි නමුත්, බැලූ බැල්මට පමණක් ඇති ප්‍රකාශන තවමත් සාමාන්‍ය භාෂාවන්ට පමණක් ගැලපේ.

/(?=.*(\QE\\){2}z\/\z)^\/\(\?\=\.\*\(\\Q.{76}\E\\){2}z\/\z)^\/\(\?\=\.\*\(\\Q.{76}\z/

එය මෙහි උත්සාහ කරන්න.

නැතිව බයිට් 610 ක් \Q...\E(ගොල්ෆ් කිරීමට):

/^(?=.{610}$)(?=.{71}(\(\.\{8\}\)\?\\.[^(]*){57}\)\{2\}\.\{12\}\$\/D$)((.{8})?\/(.{8})?\^(.{8})?\((.{8})?\?=(.{8})?\.(.{8})?\{610(.{8})?\}(.{8})?\$(.{8})?\)(.{8})?\((.{8})?\?=(.{8})?\.(.{8})?\{71(.{8})?\}(.{8})?\((.{8})?\\(.{8})?\((.{8})?\\(.{8})?\.(.{8})?\\(.{8})?\{8(.{8})?\\(.{8})?\}(.{8})?\\(.{8})?\)(.{8})?\\(.{8})?\?(.{8})?\\(.{8})?\\(.{8})?\.(.{8})?\[(.{8})?\^(.{8})?\((.{8})?\](.{8})?\*(.{8})?\)(.{8})?\{57(.{8})?\}(.{8})?\\(.{8})?\)(.{8})?\\(.{8})?\{2(.{8})?\\(.{8})?\}(.{8})?\\(.{8})?\.(.{8})?\\(.{8})?\{12(.{8})?\\(.{8})?\}(.{8})?\\(.{8})?\$(.{8})?\\(.{8})?\/D(.{8})?\$(.{8})?\)(.{8})?\(){2}.{12}$/D

එය මෙහි උත්සාහ කරන්න.

අදහස සමාන ය.

/^(?=.{610}$)(?=.{71}(\(\.\{8\}\)\?\\.[^(]*){57}\)\{2\}\.\{12\}\$\/D$)
((.{8})?\/(.{8})?\^(.{8})?\((.{8})?\?=(.{8})?\.(.{8})?\{610(.{8})?\}(.{8})?\$(.{8})?\)
(.{8})?\((.{8})?\?=(.{8})?\.(.{8})?\{71(.{8})?\}
  (.{8})?\((.{8})?\\(.{8})?\((.{8})?\\(.{8})?\.(.{8})?\\(.{8})?\{8(.{8})?\\(.{8})?\}
    (.{8})?\\(.{8})?\)(.{8})?\\(.{8})?\?(.{8})?\\(.{8})?\\
    (.{8})?\.(.{8})?\[(.{8})?\^(.{8})?\((.{8})?\](.{8})?\*(.{8})?\)(.{8})?\{57(.{8})?\}
  (.{8})?\\(.{8})?\)(.{8})?\\(.{8})?\{2(.{8})?\\(.{8})?\}
  (.{8})?\\(.{8})?\.(.{8})?\\(.{8})?\{12(.{8})?\\(.{8})?\}
  (.{8})?\\(.{8})?\$(.{8})?\\(.{8})?\/D(.{8})?\$(.{8})?\)(.{8})?\(){2}.{12}$/D

මූලික නිත්‍ය ප්‍රකාශනය

බැලීමේ අවසරය නොමැති නම්, මට දැන් කළ හැකි හොඳම දේ:

/\\(\\\(\\\\){2}/

ගැලපෙන

\\(\\\(\\

නම් {m,n}quantifier අවසර නැත එකම එක string ගැලපෙන හැකි කිසිවක්, තවදුරටත් තමාට වඩා වැලක් ගැලපෙන කර ගත හැකි නිසා., එය කළ නොහැකි ය ඇත්ත වශයෙන්ම කෙනෙකුට තවමත් \qගැලපෙන දෙයක් නිර්මාණය කළ හැකි /\q/අතර, එම නිත්‍යය සමඟ ප්‍රකාශන තවමත් කියන්න. නමුත් පෙනෙන ආකාරයට මේ කිසිවක් ප්‍රධාන ක්‍රියාත්මක කිරීම් වලට සහාය නොදක්වයි.


5
ආකර්ෂණීය. මම යම් කාලයක් ගත කර එය වෙනත් දෙයකට ගැලපෙන පරිදි ලබා ගැනීමට උත්සාහ කළෙමි.
primo

79
මිනිසෙකුට එවැනි දෙයක් නිපදවිය හැක්කේ කෙසේද?
xem

64
මෙම වෙබ් අඩවියේ වැඩිම ඡන්දය දුන් පිළිතුර වීමට මෙය සුදුසුයි.
ක්‍රන්චර්

45
මෙය මා දැක ඇති වඩාත්ම විකාර, ඇදහිය නොහැකි දෙයයි.
ඇලෙක්ස් ඒ.

24
කවුරුහරි මෙම පෝස්ට් එක ට්වීට් කර ඇති නිසා මට දිනකට
ඉහළට
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.