Slide 1

Slide 1 text

ࣅͨ΋ͷಉ࢜ͷ 1FSMͱ1)1 w ߚന΃ͺ߹ઓ΃ͺ#BBO(BBJ-5 w IUUQTDPOOQBTTDPNFWFOU

Slide 2

Slide 2 text

ࣗݾ঺հ w 1FSM.POHFSʹ1)1ͷਓɺ1)1ͷਓʹ1FSMͷਓͱ ͍ΘΕΔί΢ϞϦͷV[VMMBͰ͢ w )BDIJPKJQNͱ͍͏QN 1FSM.POHFSͷ.FFUVQ Λओ࠵͍ͯ͠·͢ w ͱ͸͍͑ɺ࠷ۙ͸Ί͖ͬΓ1FSMͷਓͱ͸ࢥΘΕͳ ͘ͳΓ·ͨ͠Ͷʜ w ͜ͷ৔Ͱ͸إ͕޿͍ํ Β͍͠ ͳͷͰɺനࠇ͔ͭ ͳ͍άϨʔκʔϯύʔιϯͱͯ͜͜͠ʹ͍ΔͬΆ ͍Ͱ͢

Slide 3

Slide 3 text

ͱ͍͏͜ͱͰʜ w 1FSMͱ1)1ͰΑ͘ࣅͯΔ΋ͷͱ͍͑͹ʜ

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

w ʮ͸ΈΜͳ޷͖ͩΖʯʮͦ͏͔ʁʁʯ w ʮ৭͕פ৭ܥʯʮʁʁʁʯ

Slide 6

Slide 6 text

w ਖ਼نදݱͰ͢Ͷʂʂʂ w 1)1ͷਖ਼نදݱ͸1$3& 1FSM$PNQBUJCMF3FHVMBS&YQSFTTJPOT w ʮޓ׵ੑ͕͋Γͦ͏ʂʂʂʯ w ࣮ࡍͦͬ͘Γʂʂ ʁ

Slide 7

Slide 7 text

ʮ͑ͬʯ

Slide 8

Slide 8 text

Τϯδϯ͸ࣅͯΔ͕ɺΠϯλʔϑΣʔε͕ҧ͏ w 1FSM͸͜ΜͳϦςϥϧ ͕͋Δ $txt = "ABC"; $txt =~ s/A/a/; print $txt; w 1)1͸͜Μͳؔ਺Λ࢖͏ $txt = preg_replace("/A/u", "a", "ABC"); echo $txt; w *'Ҏ֎͸ͦͬ͘Γʂʂʂ

Slide 9

Slide 9 text

Ωϟϓνϟͷྫ1)1 preg_match( '| (?P https?) # SchemeΛΩϟϓνϟ :// # "://" (?P [^/\s]+) # ϗετ໊ΛΩϟϓνϟ |x', "https://test.com/", $matches ); $scheme = $matches['scheme']; $host = $matches['host'];

Slide 10

Slide 10 text

Ωϟϓνϟͷྫ1FSM $input = "https://test.com"; $input =~ m{ (? https?) # SchemeΛΩϟϓνϟ :// # "://" (? [^/\s]+) # ϗετ໊ΛΩϟϓνϟ }x; my $scheme = $+{scheme}; # ͕݁͜͜ߏΫη͔ͳʁ my $host = $+{host};

Slide 11

Slide 11 text

ஔ׵ͷྫ1FSM $input =~ s/abc/ do { # ͜ͷதʹίʔυ͕ॻ͚Δ my $matched = $&; # Ωϟϓνϟͨ͠΋ͷΛͱΓͩ͠ uc($matched); # ॲཧΛॻ͖ɺ࠷ޙͷධՁ͕ஔ׵ޙʹ } /ge; # ʮҎԼͰ͑͑΍Ζʯʮ͔ͨ͠ʹʯ(ucͱ͍͏func͕͋Γ·͢) $input =~ s/(abc)/uc($1)/ge;

Slide 12

Slide 12 text

ஔ׵ͷྫ1)1 preg_replace_callback("/abc/", function($matches) { return strtoupper($matches[0]); }, $input); w ศརػೳɺΠϯϥΠϯจࣈྻ࿈݁Մೳͳ&WBM͸ةݥͳͷͰফ͑·ͨ͠ # php<=5.4 ͸ϑϥάʹeΛ͚ͭΔͱevalͰ͖ͨ $func = "strtoupper"; preg_replace("/abc/e", $func."('\\0')", $input);

Slide 13

Slide 13 text

දʹͯ͠ΈΔ ಛ௃ 1FSM 1)1 جຊࢀর a a a aʢಉ͡ʣ ໊લ෇͖ఆٛ (?pattern) (?Ppattern) ໊લ෇͖ࢀর \k \k'name' (?P=name) Ωϟϓνϟ݁Ռ $1 $2͕ࣗಈͰએݴɻ ໊લ෇͖ͩͱ$+{name} Ҿ਺ʹ$matchesͳͲΛࢦఆ ͢Δͱ࿈૝഑ྻ͕એݴ͞ΕΔ ࣗಈม਺ $_ ػೳͱͯ͠ͳ͍

Slide 14

Slide 14 text

ͦͬ͘ΓͰ͢Ͷʂ w ਖ਼نදݱࣗମͷه๏͸΄΅ҰॹͳΜΑͶɺߏจ΍ɺ஋ͷग़͠ೖΕͷํ๏͕ͪΐͬ ͱҧ͏͘Β͍ɻ `preg_replace` <=> `s///` `preg_match` <=> `m///` w Ͳ͕ͬͪ޷͖Ͱ͔͢ʁ

Slide 15

Slide 15 text

w 1)1FS ʮͳΜ͔ʜ1FSMͷํ͕͓͠ΌΕͩͳΝʂʯ w Ұൠ௨ա1)1FS ʮ͓͠ΌΕʜʁͨͱ͑͹͜͏͔ʁʯ $_ = "https://example.jp"; if (m[^/]+)>) { print "Host: $+{host}\n"; } w 1)1FS ʮ͓͠ΌΕʂʯ

Slide 16

Slide 16 text

தؒ·ͱΊ w ૬ޓͰ௕ॴ୹ॴ͸͋Δ ʁʁʁ w ͪΐͬͱؾΛ෇͚Ε͹૬ޓͰΘ͔Γ͋͑ͦ͏ w ͔ͩΒ1FSMͱ1)1͸૬ੑ͕ʜྑ͍ʂʂʂ ॾઆ͋Δ w ͔͠͠ͳ͕Β΍͸Γݴޠ͕ҧ͑͹ࡉ͔͍ࠩ͸͋Δ w 1)1FSͱ1FSM.POHFS͕͓ޓ͍ʹ͢ΕҧΘͳ͍ͨΊʹ΋ʜ

Slide 17

Slide 17 text

ΫΠζ͠·͠ΐ͏ʂʂ Կ൪Ḧͩ͜͡Εʁʁʁ

Slide 18

Slide 18 text

2ߦͷઌ಄Ϛον Regex: m/^Second/ Input: "First line\nSecond line" Result: Ϛον͋Γ A) Perl B) PHP C) ྆ํ

Slide 19

Slide 19 text

౴͑# 1)1 ղઆ1)1͸σϑΥϧτͰ֤ߦͷઌ಄ʹϚον͠·͢ɻ1FSMͰ͸σϑΥϧτͰจࣈ ྻશମͷઌ಄ʹ͔͠Ϛον͠·ͤΜɻ1FSMͰ֤ߦͷઌ಄ʹϚονͤ͞Δʹ͸ɺmϑ ϥάʢϚϧνϥΠϯϞʔυʣ͕ඞཁͰ͢ɻ

Slide 20

Slide 20 text

2ෳ਺ߦϚονϯά Regex: m/.+/ Input: "hello\nworld" Result: Ϛον༗Γɺൣғ͸ "hello\nworld" A) Perl B) PHP C) ྆ํ

Slide 21

Slide 21 text

౴͑" 1FSM ղઆ1FSM͸σϑΥϧτͰυοτ ͕վߦʹϚον͠·͢ɻͭ·Γɺෳ਺ߦʹ·ͨ ͕ΔจࣈྻશମʹϚον͠·͢ɻ 1)1Ͱ͸σϑΥϧτͰυοτ ͸վߦʹϚον͠ͳ͍ͨΊɺෳ਺ߦʹ·͕ͨΔϚ ονϯάΛߦ͏ʹ͸sϑϥάʢ1$3&@%05"-- υοτΦʔϧϞʔυʣ͕ඞཁͰɺ ςετ͕ශऑͳίʔυͰ͠͹͠͹͜ͷόάΛݟ͔͚·͢ɻ php > preg_match_all("/.+/", "hello\nworld", $m); var_dump($m); array(1) { [0]=> array(2) { [0]=> string(5) "hello" [1]=> string(5) "world" } }

Slide 22

Slide 22 text

2ϩάղੳύλʔϯ Regex: m/^(\d{4}-\d{2}-\d{2}).*/ Input: 2024-01-01 Error 2024-01-02 Warning Expected: 2ߦϚον Actual: 1ߦϚον όάͷݪҼ͸ʁ A) PerlͰ/mϑϥά͕ඞཁ B) PHPͰmϑϥάΛ࡟আ͢Δඞཁ͕͋Δ C) ೖྗͷվߦίʔυ͕ҧ͏

Slide 23

Slide 23 text

౴͑" 1FSMͰNϑϥά͕ඞཁ ղઆ1FSMͰϩάϑΝΠϧղੳΛߦ͏ࡍɺ^͕֤ߦͷઌ಄ʹϚον͢ΔΑ͏ʹ͢Δʹ ͸mϑϥάʢϚϧνϥΠϯϞʔυʣ͕ඞཁͰ͢ɺͦ͏͠ͳ͍ͱจࣈྻͷઌ಄ʹͷΈ Ϛονͯ͠͠·͍·͢ɻ 1)1Ͱ͸σϑΥϧτͰ֤ߦͷઌ಄ʹϚον͠·͢ɻ ͕ɺͦͷ͍ͤͰվߦΛߟྀ͠ͳ͍ ͰΑ͍ͱ৴͡ࠐΜͩ ࣌ʹ^$ͷ᠘ ͠͹͠͹ɺΫ ϦςΟΧϧͳόϦσʔγϣϯϛεʹͳΔ ͕ଟ͘ɺେ఍ͷ৔߹͸\A\z จࣈྻͷઌ ಄ͱɺऴ୺ Λ࢖͏΂͖ͩͱࢲ͸ࢥ͍·͢ ॾઆ͋Δ

Slide 24

Slide 24 text

26OJDPEFจࣈΫϥε Regex: m/\w+/ Input: "͜Μʹͪ͸" Result: No Match A) Perl B) PHP C) ྆ํ

Slide 25

Slide 25 text

౴͑$ ྆ํ ղઆ1FSMͰ͸\w͕σϑΥϧτͰ"4$**จࣈʹͷΈϚον͠·͢ɻ 6OJDPEFจࣈʹϚονͤ͞Δʹ͸ɺίʔυ಺ʹͯuse utf8;ϓϥάϚΛ࢖༻͢Δ ౳ͷඞཁ͕͋Γ·͢ɻ 1FSM.POHFSʮࢦఆ͠ͳ͍ͱ͔͋Γ͑ͳ͍ͩΖɺഅࣛʹͯ͠Δͷ͔ʯ ࢲʮŰŘŕʯ ·ͨɺ1)1Ͱ͸จࣈྻ͸όΠφϦͱͯ͠ѻΘΕΔͷͰɺ"/\w+/u",ͱVUGϑϥ άΛ͚ͭ·͢ɻ 1)1FSʮ͜͜ʹ೔ຊޠ͜ͳ͍͠ʯ ീԦࢠࡏॅ1)1FSʮ͍͍͔ΒVΛ͚ͭͱ͚ʯ

Slide 26

Slide 26 text

2େจࣈখจࣈม׵ Regex: s/(\w+)/\U$1/g Input: "hello world" Result: "HELLO WORLD" A) Perl B) PHP C) ྆ํ

Slide 27

Slide 27 text

౴͑" 1FSM ղઆ1FSM͸૊ΈࠐΈͷ\Uม׵Λαϙʔτ͓ͯ͠Γɺਖ਼نදݱͷஔ׵Ͱେจࣈม׵ ͕ՄೳͰ͢ɻ ਖ਼نදݱͱ͍͍ͭͭɺػೳతʹ͸ਖ਼نදݱͰ΋ͳΜͰ΋ͳ͘ɺจࣈྻॲཧͰ͢ ͕ʜ \u͸ɺจࣈ໨͚ͩେจࣈʹ͢Δͱ͔Ͱ͖ͯศར IFMMP)FMMP ʜͦ͏ʜ͚ͩͲͭ ͔ͬͨ͜ͱͳ͍ͳʁ 1)1Ͱ͸ಉ༷ͷม׵Λߦ͏ʹ͸preg_replace_callbackؔ਺Λ࢖༻ͯ͠ίʔϧ όοΫ಺Ͱstrtoupperؔ਺౳Λݺͼग़͢ඞཁ͕͋Γ·͢ɻ

Slide 28

Slide 28 text

2ޙํࢀর Regex: m/(<([a-z]+)>.*?\2>)/ Input: "
content
" Result: Match! A) Perl B) PHP C) ྆ํ

Slide 29

Slide 29 text

౴͑$ ྆ํ ղઆ਺஋ʹΑΔޙํࢀর͸1FSMͱ1)1ͷ྆ํͰαϙʔτ͞Ε͍ͯ·͢ɻ ͲͪΒͷݴޠͰ΋ɺΩϟϓνϟάϧʔϓͷ൪߸Λ࢖༻ͯ͠ޙํࢀরΛߦ͏͜ͱ͕Ͱ ͖·͢ɻ ͕͢͞ʹ͜Ε͘Β͍͸Ͱ͖ͳ͍ͱ͓͔͍͠Ͱ͢ΑͶɻ

Slide 30

Slide 30 text

2ίϝϯτߏจ Regex: /(?#͜ͷ෦෼͸ίϝϯτ)abc/x Input: "abc" Result: Match! ͜Ε͸ ͲͪΒʁ A) Perl B) PHP C) ྆ํ

Slide 31

Slide 31 text

౴͑$ ྆ํ ղઆ༧૝֎͔΋͠Ε·ͤΜ͕ɺ1FSMͱ1)1ͷ྆ํͰαϙʔτ͞Ε͍ͯ·͢ɻ 1FSMͷํ͕ΑΓॊೈͰ͕͢ɺ·͋ͦΜͳෳࡶͳίϝϯτͤΜ΍ΖɻͦΜͳෳࡶͳ ΒɺYϑϥά͔ͭͬͯͰίϝϯτͨ͠΄͏͕͍ٓ͠ɻ

Slide 32

Slide 32 text

2৚݅෼ذ Regex: m/(a)?b(?(1)c|d)/ Input: "abc" Result: Match! ͜Ε͸ ͲͪΒʁ A) Perl B) PHP

Slide 33

Slide 33 text

౴͑$ ྆ํ ղઆ৚݅෇͖Ϛονϯά͸1FSMͱ1)1ͷ྆ํͰαϙʔτ͞Ε͍ͯ·͢ɻ m/(a)?b(?(1)c|d)/ ͜ͷέʔεͩͱɺB ʹΩϟϓνϟάϧʔϓ Λ͔ͭͬͯD EͷϚον৚݅Λ੍ޚͯ͠ ͓ΓɺBCDɺ͋Δ͍͸CEʹϚον͠·͢ɻ ͕ɺ1)1FS͸ଟ෼࢖ͬͨ͜ͱ͕ແ͍ͱࢥ͍·͢ɻ

Slide 34

Slide 34 text

2ᩦཉϚονϯά Regex: m/a.*b/ Input: "a" + "x" * 1000000 + "b" Result: ελοΫෆ଍΍ϝϞϦෆ଍ ૣ͘Τϥʔʹͳͬͯ͠·͏ͷ͸ʁ A) Perl B) PHP C) ࠩ͸ͳ͍

Slide 35

Slide 35 text

౴͑# 1)1 ղઆجຊతʹ͸1FSMͱ1)1ͷ྆ํͰɺᩦཉϚονϯά͸େ͖ͳೖྗͰελοΫΦ ʔόʔϑϩʔ΍ϝϞϦ੍ݶ௒ա͕ൃੜ͢ΔՄೳੑ͕͋Γ·͢ɻ ͨͩ͠ɺ1)1ͷํ͕ૣ͘ΤϥʔʹͳΔ͸ͣͰ͢ɻ ͳͥͳΒΦʔόʔϑϩʔ͢ΔΑ͏ͳίʔυ͸େ఍1)1FSͷϛεͳͷͰɺͬ͞͞ͱऴ ྃͯ͠ඃ֐Λ࠷খݶʹ͠·͢ɻ

Slide 36

Slide 36 text

2όοΫτϥοΩϯά Regex: m/(a|aa|aaa|aaaa|aaaaa|aaaaaa)*/ Input: "aaaaa" ... (a͕݁ߏ୔ࢁ Result: ࣦഊ(Ϛονͤͣ) ͜Ε͸ ͲͪΒʁ A) ͲͪΒ͔ͱ͍͑͹Perl B) ͲͪΒ͔ͱ͍͑͹PHP

Slide 37

Slide 37 text

౴͑# ͲͪΒ͔ͱ͍͑͹1)1 ղઆ1)1͸1)1FSΛ৴͍ͯ͡ͳ͍ͷͰɺ΄͔ͷϓϩηεʹ໎࿭Λ͔͚ͳ͍Α͏ ʹɺͬ͞͞ͱ༏͘͠ڧ੍ऴྃ͠·͢ɻ όοΫτϥοΩϯάͷ੍ݶ͸QIQJOJͰௐ੔͢Δ͜ͱ΋Ͱ͖·͢ɻ # Α͘ղΒͳ͍͚Ͳ͜ΕΛ΍ͬͨΒͳ͓ͬͨɺফ͞ͳ͍Ͱ͍ͩ͘͞ ini_set('pcre.backtrack_limit', 99999999999); (*SKIP)(*FAIL)౳ͷςΫ΋͋Γ·͕͢ɺ1)1FS͸࢖͍·ͤΜ ʁʁʁ 1FSM͸όοΫτϥοΩϯά੍ݶ͕ͳ͘ɺݶք·Ͱ͕Μ͹Γ·͢ɻ ͭ·Γ1FSM͸1FSM.POHFSΛա৴͍ͯ͠ΔͷͰɺ͠͹͠͹NPE@QFSM͕མͪ·͢ ݹ

Slide 38

Slide 38 text

͍͔͕Ͱ͔ͨ͠ʁ w ΫΠζʹͰ͖Δఔ౓ʹ͸ɺࠩ͸େ͖͘ͳ͍Ͱ͢ΑͶʁ w ͔͠͠ɺվߦΈ͍ͨʹ୯७ͳ෺Ͱ΋ڍಈ͕ࠩ͋ΔͷͰؾΛ͚ͭͳ͖Ό͍͚·ͤΜ w 1FSM͸؆ܿʹॻ͚ͯύϫϑϧͰ͕͢ɺ͍֮͑ͯͳ͍ͱॻ͖ʹ͍͘ॴ͕͋Γ·͢ ͠ɺϛεΔͱ00.͠·͢ɻ w 1)1͸γϯϓϧͰෛՙʹ͸ϑΣΠϧηʔϑ͕͋Γ·͕͢ɺίʔυ͸खଓ͖తͰ͢ ͠ɺݶք·Ͱ࢖͍͍ͨ࣌͸QIQJOJͷௐ੔͕ඞཁͰ͢ɻ w ͱ͸͍͑ࠜͬ͜͸ࣅ͍ͯΔͷͰɺ૬ޓͰཧղ͢Δͷ͸೉͘͠ͳ͍Ͱ͠ΐ͏ʂ ɹ͓ޓ͍͔֬Ίͳ͕Β΍͍͖ͬͯ·͠ΐ͏ʂ w ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ