äžèŽã®äžèЧãšãã£ããã£ã°ã«ãŒã
衚ã«ã¯æåã®300ä»¶ã ããåºããŠããŸãã
$& ã¯äžèŽããå šäœã$1ã»$2 ⊠ã¯1çªç®ã»2çªç®ã®ãã£ãã$<name> ã¯ååä»ãã°ã«ãŒãã®äžèº«ã«çœ®ãæãããŸãã
ãã䜿ããã¿ãŒã³
æžãæ¹ã®æ©èŠè¡š
. | æ¹è¡ä»¥å€ã®ãã©ãã1æå |
\d | æ°å1æåïŒ0ã9ïŒ |
\w | è±æ°åãšã¢ã³ããŒã¹ã³ã¢1æå |
\s | 空çœ1æåïŒã¹ããŒã¹ã»ã¿ãã»æ¹è¡ãªã©ïŒ |
[abc] | aã»bã»c ã®ã©ãã1æå |
[^abc] | aã»bã»c 以å€ã®1æå |
a* | a ã®0å以äžã®ç¹°ãè¿ã |
a+ | a ã®1å以äžã®ç¹°ãè¿ã |
a? | a ããã£ãŠããªããŠããã |
a{2,4} | a ã®2ã4åã®ç¹°ãè¿ã |
a*? | ã§ããã ãçãäžèŽïŒæçäžèŽïŒ |
^ | è¡ïŒãŸãã¯ããã¹ãïŒã®å é |
$ | è¡ïŒãŸãã¯ããã¹ãïŒã®æ«å°Ÿ |
\b | åèªã®åºåã |
(abc) | ã°ã«ãŒãïŒäžèº«ã $1 ãªã©ã§åãåºããïŒ |
(?<name>abc) | ååä»ãã°ã«ãŒãïŒ$<name> ã§åãåºããïŒ |
(?:abc) | åãåºããªãã°ã«ãŒã |
a|b | a ãŸã㯠b |
(?=abc) | åŸãã« abc ãç¶ãäœçœ®ïŒå èªã¿ïŒ |
(?!abc) | åŸãã« abc ãç¶ããªãäœçœ®ïŒåŠå®ã®å èªã¿ïŒ |
(?<=abc) | åã« abc ãããäœçœ®ïŒåŸèªã¿ïŒ |
\1 | 1çªç®ã®ã°ã«ãŒããšåãæåïŒåŸæ¹åç §ïŒ |
å ¥åãããã¿ãŒã³ãšããã¹ãã¯ãã©ãŠã¶ã®äžã ãã§åŠçãããå€éšã®ãµãŒããŒã«ã¯éä¿¡ãããŸããã
説æ
æ£èŠè¡šçŸã®ãã¿ãŒã³ãæã£ããšããã«äžèŽããããããã®å Žã§ç¢ºãããããããŒã«ã§ãã
äžèŽããéšåã®è²ä»ãããã£ããã£ã°ã«ãŒãã®äžèЧã眮æã®çµæãåæã«èŠãããã®ã§ãããã°ã©ã ã«çµã¿èŸŒãåã®ç¢ºèªããããã°ã«äœ¿ããŸãã
æäœã®æé
- ãæ£èŠè¡šçŸã®ãã¿ãŒã³ãã«ãã¿ãŒã³ãå ¥åããå¿ èŠãªãã©ã°ïŒgã»iã»m ãªã©ïŒãéžã³ãŸã
- ã調ã¹ãããã¹ããã«æç« ãå ¥ãããšããäžèŽããéšåããè²ä»ããããŸãïŒé£ãåãäžèŽã¯è²ãå€ããŠããŸãïŒ
- ãäžèŽã®äžèЧãšãã£ããã£ã°ã«ãŒããã§ãäžèŽããäœçœ®ãšããã£ãïŒã°ã«ãŒãïŒããšã®äžèº«ã確èªã§ããŸã
- ã眮æã詊ããããªã³ã«ãããšã眮æåŸã®æåã䜿ã£ãçµæã確èªã§ããŸã
- ããã䜿ããã¿ãŒã³ãã®ãã¿ã³ã§ãã¡ãŒã«ã»URLã»æ¥ä»ãªã©ã®ãã¿ãŒã³ãå ¥ããããŸããå ¥åããå 容ã¯ããã®ç«¯æ«ã®ãã©ãŠã¶ã«ä¿åãããŸã
èšç®æ¹æ³
- ãã¿ãŒã³ã¯ JavaScript ã®æ£èŠè¡šçŸïŒãã©ãŠã¶ã® RegExpïŒãšããŠèªã¿ãŸããPHPã»Pythonã»Java ãªã©ãšã¯ãæžãæ¹ãå°ãéãéšåããããŸã
- ç §åã¯ç»é¢ãšã¯å¥ã®å ŽæïŒWeb WorkerïŒã§è¡ãã1.5ç§ãè¶ ãããæ¢ããŸããæžãæ¹ã«ãã£ãŠæ¥µç«¯ã«æéãããããã¿ãŒã³ïŒããã¯ãã©ãã¯ã®ççºïŒã§ããç»é¢ã¯åºãŸããŸãã
ãæ³šæ
- äžèŽã¯æå€§1000ä»¶ãŸã§æ°ããŸãïŒè¡šã«ã¯æåã®300ä»¶ã衚瀺ããŸãïŒ
- g ãã©ã°ãä»ããªããšãã¯ãæåã®1ä»¶ã ããæ¢ããŸã
- åŸèªã¿ïŒ(?<=âŠ)ïŒãååä»ãã°ã«ãŒãã¯ãå€ããã©ãŠã¶ã§ã¯äœ¿ããªãããšããããŸã
æ£èŠè¡šçŸã¯ã1950å¹Žä»£ã«æ°åŠè ã®ã¹ãã£ãŒãŽã³ã»ã¯ãªãŒããèãããæ£èŠéåãã®è¡šãæ¹ãããšã«ãªã£ãŠããŸãã1960幎代㫠Ken Thompson ãããã¹ããšãã£ã¿ã«çµã¿èŸŒãã ããšã§ãããã°ã©ããŒã®éå ·ãšããŠåºãŸããŸããã
(a+)+$ ã®ãããªãç¹°ãè¿ãã®äžã®ç¹°ãè¿ããã¯ãäžèŽããªãæååãäžãããšã詊ãçµã¿åãããççºçã«å¢ããç
§åã«äœåããããããšããããŸãããããæªçšããæ»æã¯ ReDoSïŒæ£èŠè¡šçŸã«ãããµãŒãã¹åŠšå®³ïŒãšåŒã°ããå®éã«å€§ããªãµãŒãã¹ãæ¢ãŸã£ãäŸããããŸãã
æ£èŠè¡šçŸã«ã¯æ¹èšããããJavaScriptã»PCREïŒPHPãªã©ïŒã»Pythonã»Java ãªã©ã§ã䜿ããæžãæ¹ãå°ããã€éããŸããããšãã° JavaScript ã§ã¯é·ãåŸèªã¿ã䜿ããŸããã§ãããã2018幎ã®ä»æ§ïŒES2018ïŒã§ååä»ãã°ã«ãŒããåŸèªã¿ã䜿ããããã«ãªããŸããã
ã¿ããªã®å£°ã»ãæèŠããã¯ã¹
ãæ£èŠè¡šçŸãã¹ã¿ãŒãã«ã€ããŠãææ³ã»äœ¿ãã«ãããšããã»æ¬²ããæ©èœãªã©ãæ°è»œã«æããŠãã ããã
ãŸã æçš¿ããããŸãããæåã®äžèšããåŸ ã¡ããŠããŸãïŒ
å©çšã«ãéã¯ããããŸããïŒäŒå¡ç»é²ã¯å¿ èŠã§ããïŒ
å ¥åããå 容ã¯ãµãŒããŒã«éãããŠããŸããïŒ
ã³ã¡ã³ãæ¬ã«æçš¿ãããå 容ã ãã¯ãä»ã®æ¹ã«ãèªãã§ããã ãããã«ãµãŒããŒãžä¿åãããŸãã