æ£èŠè¡šçŸã®ä»çµã¿ â ãæ³šæçªå·ã ãããèŠã€ããã«ãŒã«
泚æçªå·ã®ã«ãŒã«ããå°ããã€èªã
ãŸãã¯ããORD-ãšæ°å3æ¡ããæ¢ã
é·ãäžèЧããæ³šæçªå·ã ããæŸããšããæ£èŠè¡šçŸã§æåã®äžŠã³ã®ã«ãŒã«ãæžããŸããPython 3ã䜿ãããªããregex-demo.pyãšããŠä¿åããpython regex-demo.pyã§è©ŠããŠã¿ãŸãããã
import re
pattern = r"ORD-[0-9]{3}"
text = "åä» ORD-123 / åãåãã ORD-456"
print(re.findall(pattern, text))
print(bool(re.fullmatch(pattern, "ORD-123")))
print(bool(re.fullmatch(pattern, "ORD-1234")))
['ORD-123', 'ORD-456']
True
False
æ€çŽ¢ããŠèŠã€ããããšãšãå ¥åå šäœãã«ãŒã«ã«åãããšã¯å¥ã§ããfindallã¯äžèŽããéšåãéããfullmatchã¯å ¥åå šäœãèŠãŸãããã®äŸã¯ç¬èªã«æ±ºããæ³šæçªå·ã®æžåŒã§ãå®åšããåºèã®çªå·ãæ€èšŒããã«ãŒã«ã§ã¯ãããŸããã
| éšå | ãã®äŸã§ã®èªã¿æ¹ |
|---|---|
| ORD- | ãã®ãŸãŸã®æå |
| [0-9] | ASCIIã®æ°åã1æå |
| {3} | çŽåã®æ¡ä»¶ã3å |
Pythonã®\dã¯ASCII以å€ã®Unicodeã®æ°åã«ãäžèŽãåŸãŸããèšèªã»ãã©ã°ã§æå³ãéãã®ã§ãããã§ã¯å¯Ÿè±¡ãæç€ºããŠ[0-9]ã«ããŠããŸãã
ç¶æ ã®ã¢ãã«ãšãè©Šãæ¹ãåãã
æåãèªãã§æ¬¡ã®ç¶æ ãžé²ãå³ã¯ãä»çµã¿ãçè§£ããå©ãã«ãªããŸããDFAã¯çŸåšã®ç¶æ ãšå ¥åããæ¬¡ãäžæã«æ±ºãŸãã¢ãã«ãNFAã¯è€æ°ã®å¯èœæ§ãæã€ã¢ãã«ã§ãã
NFAã ããå¿ ãããã¯ãã©ããã³ã°ããããã§ã¯ãããŸãããåè£ãåæã«é²ããå®è£ ããããRE2ã®ããã«è€æ°ã®ææ³ã䜿ããšã³ãžã³ããããŸããåŸæ¹åç §çã®æ¡åŒµæ©èœãå«ãããšãçè«äžã®æ£èŠèšèªã®ã¢ãã«ã ãã§ã¯å®éã®æ©èœãã¹ãŠã説æã§ããŸããã
ããå°ã詳ããïŒReDoSãšäœ¿ãåã
æ»ã£ãŠåè£ã詊ãå®è£ ã§ã¯ãææ§ãªç¹°ãè¿ããšäžäžèŽã«ãªãå ¥åçã®çµã¿åããã§ãèšç®éã倧ãããªãå ŽåããããŸããå ¥åäžéãæéå¶éã®æç¡ããã¿ãŒã³ã®èŠçŽãããšã³ãžã³éžå®ãåãããŠèããŸããæ æ°ãªéæå®åã«æ¿ããã ãã§å®å šã«ãªããšã¯éããŸããã
RE2ã¯åŒãåºå®ãããšãã®å ¥åé·ã«å¯Ÿããç·åœ¢ãªç §åæéãä¿èšŒããŸãããåŸæ¹åç §ãlook-aroundã«ã¯å¯Ÿå¿ããŸãããå ¥åã®é·ãã ãã§ãªãåŒã®è€éããã¡ã¢ãªã®æ¡ä»¶ããããŸãããã©ããªåŒã§ãæéããšã¯éããŸãã
2019幎7æ2æ¥ã®Cloudflareã®éå®³å ±åã§ã¯ãWAFã®åŒã«ããéå°ãªããã¯ãã©ããã³ã°ãšãå±éãä¿è·ã®ä»çµã¿çã®è€åããåé¡ã説æãããŠããŸããçãåŒãæ¬ç©ã®åå ã®åŒãšããŠçœ®ãæããã詳ãã調ã¹ãå Žåã¯äžæ¬¡å ±åãèªã¿ãŸãããã
ã¡ãŒã«ã®æžåŒã ãã§å°éå ãææè ã¯åãããŸãããHTMLã»JSONã»CSVçã«ã¯å°çšããŒãµãŒããããåºå®æåã®æç¡ã ããªãéåžžã®æååæ€çŽ¢ãåè£ã§ããé床ã¯ç®çãšå ¥åã§æž¬ããã©ã¡ããåžžã«éããšã¯æ±ºããŸããã
ð§ ãã³ã®ã³å çã®ãŸãšãïŒãæ£èŠè¡šçŸãã£ãŠåºãŠããããæåã®äžŠã³æ¹ãæžããŠãæ¢ãããã®ã«ãŒã«ããšæãã°ã ãããOKïŒ
ããŒã¿ãèªã圢åŒã¯ã·ãªã¢ã©ã€ãºã®ä»çµã¿ãPythonã§ã®ç·Žç¿ã¯Pythonå ¥éãžé²ããŸãã
åèè³æ
- PythonïŒre â findall/fullmatchã»ç¹°ãè¿ãã»Unicodeã®æ°å
- MDNïŒRegular expressions â ãã¿ãŒã³ãšæ€çŽ¢ã»åèšå·ã®åœ¹å²ã»å®è£ ããšã®ææ³
- GoogleïŒRE2 â å ¥åé·ã®ç·åœ¢æ§ãšå¯Ÿå¿ããªãæ¡åŒµæ©èœ
- CloudflareïŒ2019幎7æ2æ¥ã®éå®³å ±å â åå ã®æ£èŠè¡šçŸãšéå°ãªããã¯ãã©ããã³ã°ã»å±éçã®æ¡ä»¶