MS_RegularExpression - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki
- æ»ãïŒãã®ä»ãéçºã®è²ã ïŒ
æ£èŠè¡šçŸïŒregular expressionïŒ
- ãæååã®éåãããæååã®ç¹åŸŽ / ãã¿ãŒã³ã衚çŸããæååãã§è¡šçŸããæ¹æ³ã®äžã€ã§ããã
- æ£èŠè¡šçŸã«ãããã¿ãŒã³ ããããè¡ãªãããšã§ãåçš®æåååŠçïŒæ€çŽ¢ã眮æïŒãè¡ãªããšãã«å©çšããéæç¶ãèšèªã
æ£èŠè¡šçŸã®ãã¿ãŒã³ ãããã䜿çšããã°ãäŸãã°ã次ã®ãããªåŠçã«å©çšå¯èœã§ããã
- æååã®ãç¹åŸŽãïŒãã¿ãŒã³ïŒã«äžèŽãããæ€èšŒããã
- çšéïŒå ¥åãã§ãã¯ãªã©ã«äœ¿çšå¯èœ
- APIïŒRegex.IsMatch() ã¡ãœããã䜿çšããïŒå.Parse( ) ã¡ãœããã®åŒ·åçïŒã
- æååã®ãç¹åŸŽãïŒãã¿ãŒã³ïŒã«äžèŽããéšåæååãæãåºãã
- çšéïŒå šææ€çŽ¢åŠçãªã©ã«äœ¿çšå¯èœ
- APIïŒRegex.Matches() ã¡ãœããã䜿çšããïŒString.IndexOf( ) ã¡ãœããã®åŒ·åçïŒã
- æååã®ãç¹åŸŽãïŒãã¿ãŒã³ïŒã«äžèŽããéšåæååã眮æããã
- çšéïŒçœ®æïŒä»å ãåé€ãæžåŒå€æŽãªã©ïŒã«äœ¿çšå¯èœ
- APIïŒRegex.Replace() ã¡ãœããã䜿çšããïŒString.Replace( ) ã¡ãœããã®åŒ·åçïŒã
- æååã®ãç¹åŸŽãïŒãã¿ãŒã³ïŒã«äžèŽããæååã§æåååå²ããã
- çšéïŒæåååå²åŠçã«äœ¿çšå¯èœ
- APIïŒRegex.Split() ã¡ãœããã䜿çšããïŒString.Split( ) ã¡ãœããã®åŒ·åçïŒã
- .etc
ç§»è¡ã¡ã¢ïŒèª€èšïŒ: åæã®ãRegex.Matchs()ãã¯
Regex.Matches()ã®èª€èšãšå€æãä¿®æ£ããã
çŸåšã§ã¯ãPerlãPHPãJavaãJavaScriptã.NETãPythonãRuby ãªã©ã
åºãæ§ã
ãªã©ã³ã¿ã€ã ã«å®è£
ãããŠãããããã¹ã ãšãã£ã¿ãã¯ãŒã ããã»ããµãã¯ãããšããã
ã¢ããªã±ãŒã·ã§ã³ ãœããã®æ€çŽ¢ã»çœ®ææ©èœãªã©ã§å©çšããããšãã§ããããã«ãªã£ãŠããã
ãã ãããœãããŠã§ã¢ã«ãã£ãŠãæ¹èšããå©çšã§ããªãæ©èœããããããæ³šæãå¿ èŠã§ããã
- èšèªãã¢ããªã±ãŒã·ã§ã³ã§çްéšã®ä»æ§ãç°ãªã£ãŠããããPOSIX ã«ããæšæºèŠæ Œãå®ãããããã«æºæ ãããã®ãå¢ããŠããŠããã
- .NET ã®æ£èŠè¡šçŸã¯ãPerl5 ã®æ£èŠè¡šçŸã«å¯Ÿå¿ããããã«ãã¶ã€ã³ãããŠããã
- ãŸããAPI ãªãã·ã§ã³ãæå®ããããšã«ãã£ãŠ ECMAScriptïŒJavaScript çïŒãšåæ§ã®æ£èŠè¡šçŸã«å¯Ÿå¿ããããã«åäœã倿Žã§ããã
è£è¶³ïŒæ¹èšã®å®åçãªåœ±é¿ïŒ: ãæ¹èšãã¯äºçްãªéãã«èŠããŠã
ç§»æ€æã«éãã«å£ããåå ã«ãªããç¹ã«å·®ãåºãã®ã¯æ¬¡ã®ç¹ã
é ç® .NET JavaScript POSIX (grep) åŸèªã¿ (?<=)å¯å€é·ãå¯ å¯ïŒES2018+ïŒ äžå¯ ååä»ãã°ã«ãŒã (?<name>)(?<name>)ïŒES2018+ïŒäžå¯ \dã®ç¯å²Unicode æ°åå šéšïŒå šè§ãïŒïŒ ASCII ã®ã¿ ãã±ãŒã«äŸå æåã°ã«ãŒãæžç® [a-z-[aeiou]]ãããªã ãªã $ã®äœçœ®æ«å°Ÿã® \nã®åã«ãäžèŽæ«å°Ÿã®ã¿ è¡æ«
\dãå šè§æ°åãïŒïŒïŒãã«ãäžèŽããã®ã¯ .NET ç¹æã§ã
å ¥åãã§ãã¯ã§æ³å®å€ã®å€ãéãåå ã«ãªããããã
ASCII ã ããæå³ãããªã[0-9]ãšæèšãããã
RegexOptions.ECMAScriptãæå®ãããåæ§ã«
$ã¯æ«å°Ÿã®æ¹è¡ã®åã«ãäžèŽããããã
å³å¯ãªå ¥åãã§ãã¯ã§ã¯\zïŒæ¹è¡ãå«ãŸãªãæ«å°ŸïŒã䜿ãã// "abc\n" ã«ãäžèŽããŠããŸã Regex.IsMatch(input, @"^[a-z]+$"); // å³å¯ Regex.IsMatch(input, @"\A[a-z]+\z");
æ£èŠè¡šçŸã¯ã
- éåžžã®æåãšã
- ãã¡ã¿æåã
- ããšã¹ã±ãŒãæåã
ãçµã¿åãããŠè¡šèšãããã
æ£èŠè¡šçŸã®æžãæ¹ãç¿åŸããã«ã¯ããããã®èŠçŽ ãèŠããå¿ èŠãããã
ç¹å¥ãªæå³ãæã£ãèšå·ã
- å®éã«ã©ã®ããã«åäœãããã¯ãAPI ãªãã·ã§ã³ãçè§£ããå¿ èŠãããã
- ïŒAPI ãªãã·ã§ã³ã®æå®ã«ãã£ãŠãäžèšèŠçŽ ã®æå³ã倿ŽãããããšãããããïŒ
以äžãã.NET Framework ã®æ£èŠè¡šçŸã§äœ¿çšã§ããã¡ã¿æåã
| é çª | åºå | ã¡ã¿æå | 説æ / 泚é |
|---|---|---|---|
| 1 | äœçœ®æå®å | äœçœ®æå®å | ã ^ ããã $ ãã®äž¡æ¹ãæå®ããããšã§å
šæã®ãããã匷å¶ã§ããã ãšã¹ã±ãŒãæåã«å«ãŸããäœçœ®æå®åãããã |
| 1-1 | äœçœ®æå®å | ^ |
æååã®å
é ã衚ãïŒäžéããã®ããããæåŠïŒ â» æ£èŠè¡šçŸãéšååŒã®å é ã®ãã®ããã¡ã¿æåãšããŠèªèãããªãã |
| 1-2 | äœçœ®æå®å | $ |
æååã®æ«å°Ÿã衚ãïŒäžéããã®ããããæåŠïŒ â» æ£èŠè¡šçŸãéšååŒã®çµç«¯ã®ãã®ããã¡ã¿æåãšããŠèªèãããªãã |
| 2 | ä»£æ¿æ§æäœ | ä»£æ¿æ§æäœ | 詳现ã¯ä»£æ¿æ§æäœãåç § |
| 2-1 | ä»£æ¿æ§æäœ | | |
ã | ã ã§åºåãããæååã®ããããã éåžžãäžèšã5-2 ã®äžžæ¬åŒ§ãšäœµçšããããåç¬ã§å©çšããããšãå¯èœã |
| 3 | éæå®å | éæå®å | æ£èŠè¡šçŸã§ã®éæå®å https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/quantifiers-in-regular-expressions |
| 3-1 | éæå®å | * |
åã®æååã 0 å以äžé£ç¶ã«ãããããïŒ = {0,}ïŒã |
| 3-2 | éæå®å | + |
åã®æååã 1 å以äžé£ç¶ã«ãããããïŒ = {1,}ïŒã |
| 3-3 | éæå®å | ? |
åã®æååã 0 or 1 åãããããïŒ = {0,1}ïŒã |
| 3-4 | éæå®å | {n} |
åã®æååãïœåé£ç¶ã«ãããããã |
| 3-5 | éæå®å | {n,} |
åã®æååãïœå以äžé£ç¶ã«ãããããã |
| 3-6 | éæå®å | {n, m} |
åã®æååãïœ-ïœåé£ç¶ã«ãããããã |
| 3-7 | éæå®å |
*? ,etc. |
*ã+ã?ã{ } ã®åŸã«ã ? ããã€ããŠãæçããããã衚ãã |
| 4 | æåã¯ã©ã¹ | æåã¯ã©ã¹ | æ£èŠè¡šçŸã§ã®æåã¯ã©ã¹ https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/character-classes-in-regular-expressions |
| 4-1 | æåã¯ã©ã¹ |
.ïŒããªãªãïŒ |
æ¹è¡ïŒ\nïŒä»¥å€ã®ä»»æã®ïŒæå |
| 4-2 | æåã¯ã©ã¹ |
[ ]ïŒè§æ¬åŒ§ïŒ |
äžèšã5-1 ã«è©²åœ |
| 4-3 | æåã¯ã©ã¹ | \s |
ã¹ããŒã¹ãã¿ããªã©ã®ç©ºçœæå |
| 4-4 | æåã¯ã©ã¹ | \S |
\s 以å€ïŒ[^\s] ãšåçŸ©ïŒ |
| 4-5 | æåã¯ã©ã¹ | \d |
10 鲿°ïŒ[0-9] ãšåçŸ©ïŒ |
| 4-6 | æåã¯ã©ã¹ | \D |
\d 以å€ïŒ[^\d] ãšåçŸ©ïŒ |
| 4-7 | æåã¯ã©ã¹ | \w |
åèªã«äœ¿çšãããä»»æã®æå ïŒ [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}] ãšåçŸ©ïŒ |
| 4-8 | æåã¯ã©ã¹ | \W |
\w 以å€ïŒ[^\w] ãšåçŸ©ïŒ |
| 5 | æ¬åŒ§ | ||
| 5-1 | æ¬åŒ§ |
[ ] è§æ¬åŒ§è©³çްã¯ãè§æ¬åŒ§ã«ããæåã°ã«ãŒãããåç §ã |
äžèšã®è§æ¬åŒ§å
ã«æå®ããæåã«ãããããã ã»æåç¯å²ïŒUnicode ã®æåã³ãŒã衚ïŒã ã»æåã°ã«ãŒã 以äžã¯ãè§æ¬åŒ§å ã§ã®ã¿äœ¿ãããç¹æ®ãªã¡ã¿æåã§ããã ã»ã - ãïŒç¯å²æå®ãäŸãã° [a-z] ã§åè§è±å°æåã®æåã°ã«ãŒãã衚ããã»ã ^ ãïŒå
é ã§äœ¿ããããšãããå«ãŸããªãããšæ¡ä»¶ãå転ããã |
| 5-2 | æ¬åŒ§ |
( ) äžžæ¬åŒ§è©³çްã¯ãäžžæ¬åŒ§ã«ããæ§æäœããåç § |
äžžæ¬åŒ§å
ã«æå®ããæåãæåç¯å²ãæåã°ã«ãŒãã«å®å
šã«ãããããã ã°ã«ãŒãåæ§æäœãä»£æ¿æ§æäœããã®ä»ã®æ§æäœãæ§æããã |
| 6 | æ¥æ¬èªæåã¯ã©ã¹ïŒ\p{xxxx}ïŒ |
æ¥æ¬èªæåã¯ã©ã¹ | .NET TIPS æååã®ã²ãããªïŒã«ã¿ã«ãããã§ãã¯ããã«ã¯ïŒ - C# - ïŒ IT http://www.atmarkit.co.jp/fdotnet/dotnettips/054iskana/iskana.html |
| 6-1 | æ¥æ¬èªæåã¯ã©ã¹ | \p{IsHiragana} |
平仮å |
| 6-2 | æ¥æ¬èªæåã¯ã©ã¹ | \p{IsKatakana} |
çä»®å |
| 6-3 | æ¥æ¬èªæåã¯ã©ã¹ | \p{IsCJKUnifiedIdeographs} |
挢å |
| 6-4 | æ¥æ¬èªæåã¯ã©ã¹ | \P{xxxx} |
\p{xxxx} ä»¥å€ |
ç§»è¡ã¡ã¢ïŒè¡šã®å±éïŒ: åæã¯ PukiWiki ã®ã»ã«çµåïŒ
>/~ïŒã
䜿çšããŠããããGitHub Markdown ã«ã»ã«çµåãç¡ãããã
åãå€ãå±éããŠæ²èŒããã
ãŸãã4-4ã®èª¬æã\S以å€ãã¯\s以å€ã®èª€èšã
6-4ã®ãP{xxxx}ãã¯\P{xxxx}ã®è¡šèšæŒããšå€æãä¿®æ£ããã
è£è¶³ïŒ
\d\w㯠Unicode å šäœãæãïŒ: åè¿°ã®éãã
.NET ã®æ¢å®ã§ã¯
\dâŠ[0-9]ã ãã§ãªããå šè§æ°åã»ã¢ã©ãã¢æ°åãªã©ãå«ã\wâŠ æ¥æ¬èªã®æŒ¢åã»ããªããåèªæ§ææåãã«å«ã衚ã®ã
\dã¯[0-9]ãšå矩ããšããèšè¿°ã¯
RegexOptions.ECMAScriptãæå®ããå Žåã«éã£ãŠæ£ããã
æ¢å®ã§ã¯å矩ã§ã¯ãªãç¹ã«æ³šæããã
ãšã¹ã±ãŒãæå ã«ã¯æ¬¡ã®ãããªãã®ãããã
| é çª | åºå | æåã®ãšã¹ã±ãŒã | 説æ / 泚é |
|---|---|---|---|
| 1 | äœçœ®æå®å | äœçœ®æå®å | |
| 1-1 | äœçœ®æå®å | \b |
ã¯ãŒãã®å¢çïŒ\w æåãš \W æåã®éïŒãäŸãã°ã \bVB\bãã§åèªãšããŠã®ãVBããšãªããæ¢å®ã§ã¯æ¥æ¬èªãšè±èªã®å¢çã¯ã \bãã«å«ãŸããªããåŸã£ãŠãã \bVB\bããšããæ£èŠè¡šçŸã§ããããã¯ãVB ã§ãããšããæååäžã® VB ãæ€çŽ¢ã§ããªãã ãã ããããã«ã€ããŠã¯ãECMAScript ãªãã·ã§ã³ã§åäœã倿Žã§ããã è§æ¬åŒ§ã®äžã«ããå Žåã眮æãã¿ãŒã³ã®å Žåã¯ãäžèšã3-2 ãåç §ã |
| 1-2 | äœçœ®æå®å | \B |
\b ä»¥å€ |
| 1-3 | äœçœ®æå®å | \A |
Multiline ãªãã·ã§ã³ãç¡èŠããæååã®å é |
| 1-4 | äœçœ®æå®å | \z |
Multiline ãªãã·ã§ã³ãç¡èŠããæååã®æ«å°Ÿ |
| 1-5 | äœçœ®æå®å | \Z |
Multiline ãªãã·ã§ã³ãç¡èŠããæååã®æ«å°ŸïŒãŸãã¯æååã®æ«å°Ÿã®ã\nãã®åïŒ |
| 1-6 | äœçœ®æå®å | \G |
ååã®äžèŽãçµäºããäœçœ®ã§äžèŽããå¿ èŠãããããšãæå®ããã |
| 2 | ã¡ã¿æåã®ãšã¹ã±ãŒã | ã¡ã¿æåã®ãšã¹ã±ãŒã | åçŽã«ãåã« \ èšå·ãä»äžããã |
| 2-1 | ã¡ã¿æåã®ãšã¹ã±ãŒã | \. |
. |
| 2-2 | ã¡ã¿æåã®ãšã¹ã±ãŒã | \^ |
^ |
| 2-3 | ã¡ã¿æåã®ãšã¹ã±ãŒã | \$ |
$ |
| 2-4 | ã¡ã¿æåã®ãšã¹ã±ãŒã | \* |
* |
| 2-5 | ã¡ã¿æåã®ãšã¹ã±ãŒã | \+ |
+ |
| 2-6 | ã¡ã¿æåã®ãšã¹ã±ãŒã | \? |
? |
| 2-7 | ã¡ã¿æåã®ãšã¹ã±ãŒã | \[ |
[ |
| 2-8 | ã¡ã¿æåã®ãšã¹ã±ãŒã | \] |
] |
| 2-9 | ã¡ã¿æåã®ãšã¹ã±ãŒã | \( |
( |
| 2-10 | ã¡ã¿æåã®ãšã¹ã±ãŒã |
|ïŒãšã¹ã±ãŒãïŒ |
| |
| 2-11 | ã¡ã¿æåã®ãšã¹ã±ãŒã | \) |
) |
| 2-12 | ã¡ã¿æåã®ãšã¹ã±ãŒã | \{ |
{ |
| 2-13 | ã¡ã¿æåã®ãšã¹ã±ãŒã | \} |
} |
| 2-14 | ã¡ã¿æåã®ãšã¹ã±ãŒã | \\ |
\ |
| 3 | å¶åŸ¡æå | å¶åŸ¡æå | åçš® å¶åŸ¡æåãæ£èŠè¡šçŸäžã®æååã§è¡šãå Žåã |
| 3-1 | å¶åŸ¡æå | \a |
ãã«ïŒã¢ã©ãŒã ïŒã® \u0007
|
| 3-2 | å¶åŸ¡æå | \b |
è§æ¬åŒ§ã®äžã«ããå Žåã眮æãã¿ãŒã³ã®å Žåã¯ã\u0008
|
| 3-3 | å¶åŸ¡æå | \t |
ã¿ãã® \u0009
|
| 3-4 | å¶åŸ¡æå | \r |
ãã£ãªããž ãªã¿ãŒã³ã® \u000D
|
| 3-5 | å¶åŸ¡æå | \v |
åçŽã¿ãã® \u000B
|
| 3-6 | å¶åŸ¡æå | \f |
ãã©ãŒã ãã£ãŒãã® \u000C
|
| 3-7 | å¶åŸ¡æå | \n |
æ¹è¡æåã® \u000A
|
| 3-8 | å¶åŸ¡æå | \e |
ãšã¹ã±ãŒãæåã® \u001B
|
| 3-9 | å¶åŸ¡æå | \cC |
ASCII å¶åŸ¡æå ãšäžèŽïŒ\cC 㯠Ctrl + CïŒhttp://ja.wikipedia.org/wiki/ASCII#ASCII.E5.88.B6.E5.BE.A1.E6.96.87.E5.AD.97 |
| 4 | ã³ãŒããã€ã³ã | ã³ãŒããã€ã³ã | åçš® ã³ãŒããã€ã³ããæ£èŠè¡šçŸäžã®æååã§è¡šãå Žåã |
| 4-1 | ã³ãŒããã€ã³ã | \040 |
8 鲿°ïŒ3 æ¡ãŸã§ïŒã§è¡šããã ASCII æåãšäžèŽ |
| 4-2 | ã³ãŒããã€ã³ã | \x20 |
16 鲿°ïŒ2 æ¡ïŒã§è¡šããã ASCII æåãšäžèŽ |
| 4-3 | ã³ãŒããã€ã³ã | \u0020 |
16 鲿°(4 æ¡)ã§è¡šããã Unicode æåãšäžèŽ |
è£è¶³ïŒ
\bãæ¥æ¬èªã§å¹ããªãçç±ïŒ: 衚㮠1-1 ãè¿°ã¹ãéãã
\bã¯ã\wãš\Wã®å¢çãã§ããã
æ¢å®ã§ã¯æ¥æ¬èªïŒããªã»æŒ¢åïŒã\wã«å«ãŸããããã
ãããã¯ãVB ã§ããã®ããVB ã§ãã®éšåã«å¢çãçãŸããªãã
RegexOptions.ECMAScriptãæå®ãããš\wã
[a-zA-Z_0-9]ã«çãŸããããæ¥æ¬èªãšã®å¢çã\bã«ãªãããã ã ECMAScript ãªãã·ã§ã³ã¯
åæã«æå®ã§ãããªãã·ã§ã³ãéãããïŒIgnoreCaseãMultilineã
Compiledã®ã¿ïŒãããå¯äœçšã«æ³šæããã
代æ¿ãšããŠãæç€ºçã«å¢çãæžãæ¹æ³ãããã// ECMAScript ã䜿ããã«ãååŸãè±æ°åã§ãªã VBããæ¢ã Regex.IsMatch(s, @"(?<![a-zA-Z0-9])VB(?![a-zA-Z0-9])");
è£è¶³ïŒC# ã®ãªãã©ã«ã§ã®ãšã¹ã±ãŒãïŒ: æ£èŠè¡šçŸã®
\ã¯ã
C# ã®æååãªãã©ã«ã§ã\ããšã¹ã±ãŒãæåã§ããããã
äºéã«ãšã¹ã±ãŒããå¿ èŠã«ãªãèªã¿ã«ãããªããvar a = "\\d+"; // éåžžã®æååãªãã©ã«ïŒèªã¿ã«ããïŒ var b = @"\d+"; // éèªçæååãªãã©ã«ïŒæšå¥šïŒ var c = """\d+"""; // çæååãªãã©ã«ïŒC# 11+ã" ãæžããïŒ
@""ã䜿ãã®ãå®ç³ã"ãå«ããã¿ãŒã³ã§ã¯
C# 11 ã®çæååãªãã©ã«"""..."""ã䟿å©ã§ããã
è§æ¬åŒ§ã䜿çšããæåã°ã«ãŒãã®å®çŸ©ã«ã¯æ¬¡ã®ãããªãã®ãããã
â» äžèšã®ãChnïŒCh1ãCh2ãCh3ãCh4 ãªã©ïŒã¯æåã衚ãã
xx_ChGroupïŒBase_ChGroupãExcluded_ChGroupïŒã¯æåã°ã«ãŒãã衚ãã
[Ch1Ch2]
[Ch1-Ch2]
[Ch1-Ch2Ch3-Ch4]
[Base_ChGroup-[Excluded_ChGroup]]
.etc
[\p{xxxx}-[Excluded_ChGroup]]
[Base_ChGroup-[Ch1-Ch2\p{xxxx}]]
, etc.
è£è¶³ïŒæåã°ã«ãŒãæžç®ã¯ .NET ç¬èªïŒ:
[a-z-[aeiou]]
ïŒè±å°æåããæ¯é³ãé€ãïŒãšããæžç®åŒã¯ .NET åºæã®æ©èœã§ããã
JavaScript ã Java ã«ã¯ç¡ãã
ç§»æ€æ§ãèŠãå Žé¢ã§ã¯ãåŠå®å èªã¿ã§ä»£æ¿ããã.NET [a-z-[aeiou]] æ±çš (?![aeiou])[a-z]
äžžæ¬åŒ§ã䜿çšãã
ã«ã€ããŠèª¬æããã
-
ã°ã«ãŒãåæ§æäœã¯ãæ£èŠè¡šçŸã®éšååŒã衚ãïŒïŒã°ã«ãŒãåïŒã
-
æ£èŠè¡šçŸã«ãããããç®æã¯ãã£ããã£ããã
ãã£ããã£æååãšããŠãããã°ã©ã äžã§å©çšã§ããã -
ãã®ã°ã«ãŒãåæ§æäœã«ããã°ã«ãŒãåãã£ãŠã
æ£èŠè¡šçŸã«ãããããç®æãéšåçã«ãã£ããã£ããããšãã§ããã -
以äžã®è¡šã¯ã
- ã°ã«ãŒãåæ§æäœã®äžèЧã§ã衚äžã®ãexpressionãã¯ãæ£èŠè¡šçŸã®éšååŒãæå³ããã
| é çª | åºå | ã°ã«ãŒãåæ§æ | 説æ / æ£èŠè¡šçŸã®äŸ | ãããããéšåæåå / ãã£ããã£æåå |
|---|---|---|---|---|
| 1 | ã°ã«ãŒãå | |||
| 1-1 | ã°ã«ãŒãå | (expression) |
ã°ã«ãŒãåããç®æïŒäžžæ¬åŒ§å ããã£ããã£ããïŒã | |
| 1-1 | ã°ã«ãŒãå | (expression) |
"倧森(äžé|äºé)" |
倧森äžéãŸã㯠倧森äºé ã«ããã |
| 1-1 | ã°ã«ãŒãå | (expression) |
ãã£ããã£æåå | 倧森äžéã倧森äºé以å€ã«äžéãäºéã远å ã§ãã£ããã£ãããã |
| 1-2 | ã°ã«ãŒãå | (?:expression) |
ã°ã«ãŒãåããç®æïŒäžžæ¬åŒ§å ããã£ããã£ããªãïŒã | |
| 1-2 | ã°ã«ãŒãå | (?:expression) |
"倧森(?:äžé|äºé)" |
倧森äžéãŸã㯠倧森äºé ã«ããã |
| 1-2 | ã°ã«ãŒãå | (?:expression) |
ãã£ããã£æåå | 倧森äžéã倧森äºéããã£ããã£ãããäžéãäºéã¯ãã£ããã£ãããªã |
| 1-3 | ã°ã«ãŒãå |
(?<name>expression)â» < > 㯠' ã§ãè¯ãã |
ã°ã«ãŒãåããç®æïŒååãä»ããŠäžžæ¬åŒ§å ããã£ããã£ããïŒã | |
| 1-3 | ã°ã«ãŒãå | (?<name>expression) |
"倧森(?<name>äžé|äºé)" |
倧森äžéãŸã㯠倧森äºé ã«ããã |
| 1-3 | ã°ã«ãŒãå | (?<name>expression) |
ãã£ããã£æåå | 倧森äžéã倧森äºé以å€ã«äžéãäºéã远å ã§ãã£ããã£ãããã â» ãã®ãã£ããã£æååã¯ãã°ã«ãŒãåïŒnameïŒã䜿çšããŠåç §ã§ããã |
| 1-4 | ã°ã«ãŒãå | (?imnsx-imnsx: expression) |
æå®ããAPI ãªãã·ã§ã³ãéšååŒã«é©çšïŒimnsx ã®éšåïŒãŸãã¯ç¡å¹ïŒ-imnsx ã®éšåïŒã«ããã æ£èŠè¡šçŸã®API ãªãã·ã§ã³ https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expression-options |
|
| 1-5 | ã°ã«ãŒãå | (?<name1-name2>expression) |
ã°ã«ãŒãå®çŸ©ãåçåããã | |
| 1-6 | ã°ã«ãŒãå | (?>expression) |
éããã¯ãã©ããã³ã°éšååŒã | |
| 2 | å èªã¿ã»åŸèªã¿(æ»ãèªã¿) | |||
| 2-1 | å èªã¿ | (?=expression) |
çŽåŸã«ãã®ãã¿ãŒã³ãçŸããããšã確èªããã | |
| 2-1 | å èªã¿ | (?=expression) |
"\d+(?=%)" |
åŸãã«ã%ããç¶ãæ°åã®é£ç¶ã«ããã |
| 2-1 | å èªã¿ | (?=expression) |
ãã£ããã£æåå | ã%ãã®éšåã¯ãã£ããã£ãããªããäŸãã° 100% ã§ 100 ããã£ããã£ãããã |
| 2-2 | åŸèªã¿ | (?<=expression) |
çŽåã«ãã®ãã¿ãŒã³ãçŸããããšã確èªããã | |
| 2-2 | åŸèªã¿ | (?<=expression) |
"(?<=\\)\d+" |
ã\ãã«ç¶ãæ°åã®é£ç¶ã«ãããã |
| 2-2 | åŸèªã¿ | (?<=expression) |
ãã£ããã£æåå | ã\ãã®éšåã¯ãã£ããã£ãããªããäŸãã° \100 ã§ 100 ããã£ããã£ãããã |
| 2-3 | åŠå®å èªã¿ | (?!expression) |
çŽåŸã«ãã®ãã¿ãŒã³ãçŸããªãããšã確èªããã | |
| 2-3 | åŠå®å èªã¿ | (?!expression) |
"\d+(?![\d%])" |
åŸãã«ã%ããç¶ããªãæ°åã®é£ç¶ã«ãããã |
| 2-3 | åŠå®å èªã¿ | (?!expression) |
ãã£ããã£æåå | ã%ãã®éšåã¯ãã£ããã£ãããªããäŸãã° 100KS ã§ 100 ããã£ããã£ãããã |
| 2-4 | åŠå®åŸèªã¿ | (?<!expression) |
çŽåã«ãã®ãã¿ãŒã³ãçŸããªãããšã確èªããã | |
| 2-4 | åŠå®åŸèªã¿ | (?<!expression) |
"(?<![\d\\])\d+" |
ã\ãã«ç¶ããªãæ°åã®é£ç¶ã«ãããã |
| 2-4 | åŠå®åŸèªã¿ | (?<!expression) |
ãã£ããã£æåå | ã\ãã®éšåã¯ãã£ããã£ãããªããäŸãã° $100 ã§ 100 ããã£ããã£ãããã |
ç§»è¡ã¡ã¢: åæã¯ã»ã«çµåãš
&color()ã«ãã
ããªãã©ã«äžã®\ã®ãšã¹ã±ãŒããã®åŒ·èª¿ãçšããŠãããã
GitHub Markdown ã§ã¯ãããã衚çŸã§ããªãããã
ã»ã«ãå±éããæ£èŠè¡šçŸã¯ã³ãŒã衚èšã«çœ®ãæãã
ïŒ\\㯠C# ãªãã©ã«äžã§ã®ãšã¹ã±ãŒãã衚ãïŒã
è£è¶³ïŒ
(?:)ãš(?>)ã®å®åäžã®äŸ¡å€ïŒ:
(?:expression)ïŒéãã£ããã£ïŒ
ãã£ããã£äžèŠãªã°ã«ãŒãã«ã¯å¿ ãä»ããã
ã°ã«ãŒãçªå·ããããã®ãé²ããæ§èœãè¯ããªãã
(?>expression)ïŒã¢ããã㯠ã°ã«ãŒãïŒ
äžåºŠãããããç®æãåŸæ»ãïŒããã¯ãã©ãã¯ïŒãããªãã
åŸè¿°ã®æ§èœåé¡ïŒReDoSïŒã®äž»èŠãªå¯Ÿçã§ãããå±éº (a+)+$ â ããã¯ãã©ãã¯ãççºãã å®å š (?>a+)+$ â åŸæ»ãããªãã®ã§ççºããªã
- ã°ã«ãŒãçªå·
ãã£ããã£æååã«ã¯ãå ¶ã ã°ã«ãŒãçªå·ãäžããããã-
æ£èŠè¡šçŸã«ãããããç®æå šäœã®ãã£ããã£æååã¯ãã°ã«ãŒãçªå·ïŒãšãªãã
-
ã°ã«ãŒãåã«ããã远å ã§ãã£ããã£ããããã£ããã£æååã®ã°ã«ãŒãçªå·ã«ã¯ã
ã°ã«ãŒãã®äœçœ®é ïŒå·Šããå³ïŒã«ïŒããå§ãŸãçªå·ãäžããããã -
äŸãã°
-
"(ab)(cd)(ef)"ãšããæ£èŠè¡šçŸã«ãããããå Žåã
-
-
<----------0---------->
( a b ) ( c d ) ( e f )
<--1--> <--2--> <--3-->
- åã°ã«ãŒãã®ãã£ããã£æååã«å²ãåœãŠãããçªå·ã¯æ¬¡ã®ããã«ãªãã
å
¥å ïŒ xxxabcdefxxx
ã»ã°ã«ãŒã0 ïŒ abcdef
ã»ã°ã«ãŒã1 ïŒ ab
ã»ã°ã«ãŒã2 ïŒ cd
ã»ã°ã«ãŒã3 ïŒ ef
ç§»è¡ã¡ã¢ïŒèª€èšïŒ: åæã®ãã»ã°ã«ãŒã1 ïŒ adãã¯ã
æ£èŠè¡šçŸ(ab)ã«å¯Ÿå¿ããã®ã§ ab ã®èª€èšãšå€æãä¿®æ£ããã
-
å ¥ãåã«ã°ã«ãŒãåãããå Žåã
ã°ã«ãŒãã®ãã£ããã£æååã«å²ãåœãŠãããçªå·ã¯ã
å€åŽããå åŽã«é ã«ïŒããå§ãŸãçªå·ãäžããããã -
äŸãã°
-
"(a(b(c)(d)(e(f))))"ãšããæ£èŠè¡šçŸã«ãããããå Žåã
-
<----------------0---------------->
( a ( b ( c ) ( d ) ( e ( f ) ) ) )
<-6->
<-3-> <-4-> <----5---->
<-------------2------------->
<----------------1---------------->
- åã°ã«ãŒãã®ãã£ããã£æååã«å²ãåœãŠãããçªå·ã¯æ¬¡ã®ããã«ãªãã
å
¥å ïŒ xxxabcdefxxx
ã»ã°ã«ãŒã0 ïŒ abcdef
ã»ã°ã«ãŒã1 ïŒ abcdef
ã»ã°ã«ãŒã2 ïŒ bcdef
ã»ã°ã«ãŒã3 ïŒ c
ã»ã°ã«ãŒã4 ïŒ d
ã»ã°ã«ãŒã5 ïŒ ef
ã»ã°ã«ãŒã6 ïŒ f
ç§»è¡ã¡ã¢ïŒèª€èšïŒ: åæã¯æåŸã® 2 è¡ããããã
ãã»ã°ã«ãŒã5ããšãªã£ãŠããããå³ããã°ã«ãŒã6ãæ£ãããšå€æãä¿®æ£ããã
- ãªããã°ã«ãŒãçªå·ã¯ãã°ã«ãŒãåã®ä»äžã®åœ±é¿ãåããªãã
ç§»è¡ã¡ã¢ïŒæ£èª€ïŒ: æåŸã®äžæãã°ã«ãŒãçªå·ã¯ãã°ã«ãŒãåã®ä»äžã®
圱é¿ãåããªããã¯ã.NET ã§ã¯æãç«ããªãã.NET ã§ã¯ã
- çªå·ä»ãã°ã«ãŒãïŒç¡åïŒã«å ã« 1 ããæ¡çªããã
- ãã®åŸã§ãååä»ãã°ã«ãŒãã«ç¶ãã®çªå·ãæ¡çªãããã
var m = Regex.Match("abc", @"(?<x>a)(b)(?<y>c)"); // ã°ã«ãŒã1 = "b" â ç¡åã°ã«ãŒããå // ã°ã«ãŒã2 = "a" â ååä»ãã¯åŸåã // ã°ã«ãŒã3 = "c"çªå·ãšååãæ··åšããããšãçªå·ããããã
æ··åšãããå Žåã¯
- çªå·ã§åç §ããªãïŒååã§åç §ããïŒããŸãã¯
RegexOptions.ExplicitCaptureã§ç¡åã°ã«ãŒãã®ãã£ããã£ãæ¢ãããã®ããããã培åºããã®ãå®å šã§ããã
- ä»£æ¿æ§æäœã¯ãéžæãæ¡ä»¶åå²ã衚ãã
| é çª | ä»£æ¿æ§æäœ | 説æ / æ£èŠè¡šçŸã®äŸ | ãããããéšåæåå / ãã£ããã£æåå |
|---|---|---|---|
| 1 | (?(expression1)expression2) |
expression1 ã«äžèŽããå Žåããããã expression2 ã§æ€çŽ¢ | |
| 1 | (?(expression1)expression2) |
"(?(^倧森).*é(\r?\n|$))" |
倧森äžéã倧森äºéã倧森äžéããªã©ã®è¡ |
| 1 | (?(expression1)expression2) |
ãã£ããã£æåå | å é ãã倧森ãã®å Žåãæ«å°Ÿããxxx éãã®è¡ãããã°ããã®è¡ããã£ããã£ãããã |
| 2 | (?(expression)yes_exp|no_exp) |
expression ã«äžèŽããå Žåããããã yes_exp ã§æ€çŽ¢ äžèŽããªãã£ãå Žåããããã no_exp ã§æ€çŽ¢ |
|
| 2 | (?(expression)yes_exp|no_exp) |
"(?(^倧森).*é(\r?\n|$)|^åå·.*é(\r?\n|$))" |
倧森äžéã倧森äºéã倧森äžéãåå·äžéãåå·äºéãåå·äžéããªã©ã®è¡ |
| 2 | (?(expression)yes_exp|no_exp) |
ãã£ããã£æåå | å
é ãã倧森ãã®å Žåãæ«å°Ÿããxxx éãã®è¡ãããã°ããã®è¡ããã£ããã£ãããã ãŸããå é ãã倧森ãã§ãªãå Žåãå é ãåå·ãïœæ«å°Ÿãxxx éãã®è¡ããã£ããã£ãããã |
| 3 | (?(name)yes_exp|no_exp) |
岿 |
ãã®ä»ã®æ§æäœã¯ãæ£èŠè¡šçŸã倿ŽããéšååŒïŒAPI ãªãã·ã§ã³ãã³ã¡ã³ããªã©ïŒã衚ãã
| é çª | ãã®ä»ã®æ§æäœ | 説æ |
|---|---|---|
| 1 | (?imnsx-imnsx) |
ãã¿ãŒã³ã®éäžã§API ãªãã·ã§ã³ãé©çšïŒimnsx ã®éšåïŒãŸãã¯ç¡å¹ïŒ-imnsx ã®éšåïŒã«ããã |
| 2 | (?# ) |
æ£èŠè¡šçŸã«æ¿å ¥ããã€ã³ã©ã€ã³ ã³ã¡ã³ããã³ã¡ã³ãã¯ãæåã®å³ãã£ãæåã§çµäºããã |
| 3 |
#ïŒ»è¡æ«ãŸã§ïŒœ |
X ã¢ãŒã ã³ã¡ã³ããã³ã¡ã³ãã¯è¡æ«ãŸã§ç¶ç¶ããã ãã®ã³ã¡ã³ããèªèãããã«ã¯ã以äžã®äœããã®API ãªãã·ã§ã³ãæå¹ã«ããã ã»x ãªãã·ã§ã³ ã»IgnorePatternWhitespace ãªãã·ã§ã³ |
- ãã£ããã£æååã¯
ã§åç §ïŒå©çšïŒã§ããã
- ããã§ã¯ã
- ååŸæ¹åç § / æåå眮æã®äœ¿ç𿹿³ãšã
- ãã£ããã£æååã®åç §æ¹æ³ã«
ã€ããŠèª¬æããã
ååŸæ¹åç §ã¯ãïŒã€é£ç¶ããæåïŒæåã°ã«ãŒãïŒã®ãã¿ãŒã³ãæ€çŽ¢ããå Žåãªã©ã«äœ¿çšããã
-
ååŸæ¹åç §ã«ã¯ã以äžã®ïŒã€ã®ååŸæ¹åç §æ§æäœã䜿çšããæ¹æ³ãããã
-
ã°ã«ãŒãçªå·ïŒ
\number- ã
\1ãããã\9ããŸã§ã®åŒã¯åžžã«ååŸæ¹åç §ã衚ãã8 é²ã® ASCII ã³ãŒãã«ã¯ãªããªãã - ã
\11ã以éã®è€æ°æ¡ã®åŒã¯ããã®çªå·ã«å¯Ÿå¿ããååŸæ¹åç §ãããå Žåã«ã¯ãååŸæ¹åç §ãšèŠãªãããã - ãã以å€ã®å Žåã¯ã8 é²ã® ASCII ã³ãŒããšè§£éãããã
ãã ããå é ã®æ¡ã 8 ãŸã㯠9 ã®å Žåãé€ãã
ãã®å Žåã¯ãªãã©ã«ã® "8" ããã³ "9" ãšããŠæ±ãããã
- ã
-
ã°ã«ãŒãåïŒ
\k<name>
-
-
æ£èŠè¡šçŸã®äžã«ãæªå®çŸ©ã®ã°ã«ãŒãçªå·ãžã®ååŸæ¹åç §ãå«ãŸããå Žåã¯ã
è§£æãšã©ãŒãšèŠãªããããææ§ããåé¡ãšãªãå Žåã¯ãååã䜿çšããŠååŸæ¹åç §ããã -
äžèšã¯ã
-
ïŒã€é£ç¶ããæåïŒæåã°ã«ãŒãïŒã®ãã¿ãŒã³ãæ€çŽ¢ãããååŸæ¹åç §ãã䜿çšããæ£èŠè¡šçŸã®äŸã§ããã
-
ãååŸæ¹åç §ãã䜿çšããæ£èŠè¡šçŸã®äŸ
- ïŒã€é£ç¶ããæåã®ãã¿ãŒã³ãæ€çŽ¢ãã
-
| ã°ã«ãŒãçªå·ãäœ¿çš | ã°ã«ãŒãåãäœ¿çš | |
|---|---|---|
| æ£èŠè¡šçŸ ååŸæ¹åç § | "(\S)\1" |
"(?<ch>\S)\k<ch>" |
- ïŒã€é£ç¶ããæåã°ã«ãŒãã®ãã¿ãŒã³ãæ€çŽ¢ãã
| ã°ã«ãŒãçªå·ãäœ¿çš | ã°ã«ãŒãåãäœ¿çš | |
|---|---|---|
| æ£èŠè¡šçŸ ååŸæ¹åç § | "\b(\S+)\s+\1\b" |
"\b(?<str>\S+)\s+\k<str>\b" |
ç§»è¡ã¡ã¢ïŒèª€èšïŒ: åæã®èŠåºããïŒã€é£ç¶ããæåã¯ã«ãŒããã¯
æåã°ã«ãŒãã®èª€åãšå€æãä¿®æ£ããã
-
æåå眮æã¯ã
- æ£èŠè¡šçŸã«ãããããç®æã®ãã£ããã£æååã䜿çšããŠã
æååã®çœ®æïŒä»å ãåé€ãæžåŒå€æŽãªã©ïŒãè¡ãããšãã§ããã -
APIã䜿çšããŠãæ£èŠè¡šçŸã眮æãã¿ãŒã³ãAPI ãªãã·ã§ã³ãæå®ããŠã
ä»å ãåé€ãæžåŒå€æŽãªã©ã®åŠçãå®è¡ã§ããã
- æ£èŠè¡šçŸã«ãããããç®æã®ãã£ããã£æååã䜿çšããŠã
-
眮æãã¿ãŒã³ã«æå®ããçœ®ææ§æäœã«ã¯ã次ã®ãã®ãããã
| é çª | çœ®ææ§æäœ | 説æ |
|---|---|---|
| 1 | $number |
ã°ã«ãŒãçªå·ãšäžèŽããéšåæåå |
| 2 | ${name} |
ã°ã«ãŒãåïŒnameïŒãšäžèŽããæåŸã®éšåæåå |
| 3 | $& |
äžèŽãããã¿ãŒã³å šäœã®æåå |
| 4 | $+ |
ãã£ããã£ãããæåŸã®æåå |
| 5 | $_ |
å ¥åæååå šäœ |
| 6 | $` |
äžèŽããå Žæããåã«ããå ¥åæåå |
| 7 | $' |
äžèŽããå ŽæããåŸã«ããå ¥åæåå |
| 8 | $$ |
åäžã® "$" ãªãã©ã«ïŒãšã¹ã±ãŒãïŒ |
-
次ã«ãæ£èŠè¡šçŸã«ããæåå眮æã®äŸã瀺ãã
- ä»å
- HTML äžã® URL ã«ãªã³ã¯ãä»ããã
â» æ£èŠè¡šçŸã«ãããããç®æå šäœã®ãã£ããã£æååã¯ãçœ®ææ§æäœã$0ãã§ãã$&ãã§ãåç §ã§ããã
- HTML äžã® URL ã«ãªã³ã¯ãä»ããã
- ä»å
| ïŒïŒç | ïŒïŒç | |
|---|---|---|
| æ£èŠè¡šçŸ | "s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+" |
åå·Š |
| 眮æãã¿ãŒã³ | "<a href=\"$0\">$0</a>" |
"<a href=\"$&\">$&</a>" |
è£è¶³ïŒãã®çœ®æã¯å®åã§ã¯å±éºïŒ: äžèšã®ãããªãURL ãèŠã€ããŠ
<a>ã¿ã°ã«å€æããã眮æã¯ããã®ãŸãŸ HTML ã«åºåãããš
XSS ã®æž©åºã«ãªãã
- å ã®æååã«å«ãŸãã
<>"&ãå ã«ãšã¹ã±ãŒãããŠããªãjavascript:ãªã©ã®ã¹ããŒã ã匟ããŠããªãçŸåšã¯ãHTML ã®çæã«æ£èŠè¡šçŸã䜿ããªãã®ãååã§ããã
Razor ã®@åºåïŒèªåãšã¹ã±ãŒãïŒã
HtmlSanitizer ã®ãããªã©ã€ãã©ãªã䜿ãã
- ææžäžã®è¡é ã«åŒçšèšå·ãæ¿å
¥ããã\
â» æ£èŠè¡šçŸã«äœçœ®æå®åïŒã¢ããã㯠ãŒãå¹
ã¢ãµãŒã·ã§ã³ïŒãåç¬ã§äœ¿çšããå Žåããã£ãã㣠â 眮æãã§ããã
| æåå | |
|---|---|
| æ£èŠè¡šçŸ | "^" |
| 眮æãã¿ãŒã³ | "> " |
- åé€
- ææžäžã®è¡æ«ã®ç©ºçœæåãåé€ããã
â» åé€ããå Žåã眮æãã¿ãŒã³ã«ç©ºæååãæå®ããã
â» å®è¡æãMultiline ãªãã·ã§ã³ãèšå®ããå¿ èŠãããã
- ææžäžã®è¡æ«ã®ç©ºçœæåãåé€ããã
| æåå | |
|---|---|
| æ£èŠè¡šçŸ | "[ \t]+(?=\r?\n|$)" |
| 眮æãã¿ãŒã³ |
"" (空æåå) |
- ç¡å¹ãªæåãåé€ããã\
â» åé€ããå Žåã眮æãã¿ãŒã³ã«ç©ºæååãæå®ããã\
â» `@`ã`-` (ãã€ãã³)ãããã³ `.` (ããªãªã) 以å€ã®ãã¹ãŠã®éè±æ°æåãåãé€ããæååãè¿ãã
| æåå | |
|---|---|
| æ£èŠè¡šçŸ | "[^\w\.@-]" |
| 眮æãã¿ãŒã³ |
"" (空æåå) |
- ææžäžã®é£ç¶ããåãè¡ãåé€ããã\
â» äžèšã¯ã[ååŸæ¹åç
§](#ååŸæ¹åç
§)ã䜵çšããŠããã\
â» å®è¡æãMultiline ãªãã·ã§ã³ãèšå®ããå¿
èŠãããã
| ã°ã«ãŒãçªå·ãäœ¿çš | ã°ã«ãŒãåãäœ¿çš | |
|---|---|---|
| æ£èŠè¡šçŸ | "^(.*)(\r?\n\1)+$" |
"^(?<line>.*)(\r?\n\k<line>)+$" |
| 眮æãã¿ãŒã³ | "$1" |
"${line}" |
- æžåŒå€æŽ
- æ¥ä»ã®ãã©ãŒãããã倿ŽããïŒ
â» æç« äžããæ€çŽ¢ã倿ããå Žåã¯ãååŸã«ã\bããä»äžããå¿ èŠãããã
ããŸããæ¥æ¬èªæç« äžã®å Žåã¯ãå®è¡æãECMAScript ãªãã·ã§ã³ãèšå®ããå¿ èŠãããã
- æ¥ä»ã®ãã©ãŒãããã倿ŽããïŒ
| ã°ã«ãŒãåãäœ¿çš | |
|---|---|
| æ£èŠè¡šçŸ | "(?<year>\d{2,4})/(?<month>\d{1,2})/(?<day>\d{1,2})" |
| 眮æãã¿ãŒã³ | "${year}幎${month}æ${day}æ¥" |
- æ¥ä»ã®ãã©ãŒãããã倿ŽããïŒ
â» æç« äžããæ€çŽ¢ã倿ããå Žåã¯ãååŸã«ã\bããä»äžããå¿ èŠãããã
ããŸããæ¥æ¬èªæç« äžã®å Žåã¯ãå®è¡æãECMAScript ãªãã·ã§ã³ãèšå®ããå¿ èŠãããã
| ã°ã«ãŒãåãäœ¿çš | |
|---|---|
| æ£èŠè¡šçŸ | "(?<month>\d{1,2})/(?<day>\d{1,2})/(?<year>\d{2,4})" |
| 眮æãã¿ãŒã³ | "${day}-${month}-${year}" |
- ãã®ä»ãMatchEvaluator ããªã²ãŒãã䜿çšããŠçœ®æïŒå€æïŒãããšããæ¹æ³ããããã
ããã«ã€ããŠã¯ããAPIãã§èª¬æããã
ããã©ã«ãã§ã¯ãæé·ãããããšãªããããå¿ èŠã«å¿ããŠãæçããããã䜿çšããã
-
ãæé·ãããããšã¯ãæ€çŽ¢ãããæååãæé·ã«ãªãããã«åŠçããããšã§ããã
-
äŸãã°ãã«ã®ãã£ãïŒããïŒã§å²ãŸããæååãæ€çŽ¢ããå Žåã
- 次ã®ããã«æ£èŠè¡šçŸã衚èšããå Žåã«ã
"ã.*ã"
- ã«ã®ãã£ããè€æ°ãã£ãå Žåãåé¡ãèµ·ããã
- äŸãã°ãå ¥åæååã«ã以äžã®ããã«å ¥åãããŠãããªãã°ã
"ã»ã»ã»ãããããããããããã»ã»ã»"
- æ€çŽ¢ãããéšåæååã¯ã以äžã® 1 ã€ã ãã«ãªãã
"ããããããããããã"
- ãããã以äžã® 3 ã€ã®æååãå¥ã ã«æ€çŽ¢ãããããã«ããã«ã¯ãæçãããã䜿çšããã
"ããã"ã"ããã"ã"ããã"
- ãæçãããããšã¯ãæ€çŽ¢ãããæååãæçã«ãªãããã«åŠçããããšã§ããã
- ãæé·ããããããæçããããã«ããå Žåã以äžã®ããã«ãæžãæããå¿ èŠãããã
"ã.*ã" â "ã.*?ã"
- ãã ããäžèšã®ãããªäŸã§ããã°ã
ãæçããããã䜿çšããªããŠãã"ã[^ã]*ã"ãšæžãã°ã»ãŒåãããšãã§ããã
ç§»è¡ã¡ã¢ïŒèª€èšïŒ: åæã®ããæçããããããæçããããã«ããå Žåãã¯
ãæé·ããããããæçããããã«ããå Žåã®èª€èšãšå€æãä¿®æ£ããã
è£è¶³ïŒæåŸã®äžæãå®ã¯æéèŠïŒ: åæããã»ãŒåãããšãã§ããããš
æ§ããã«æžããŠãã **"ã[^ã]*ã"ïŒåŠå®æåã¯ã©ã¹ïŒ**ã¯ã
æçãããããæãŸããæžãæ¹ã§ããã
ã.*?ãã[^ã]*ãåäœ 1 æåé²ããŠã¯éãæ¬åŒ§ã詊ãïŒããã¯ãã©ãã¯ïŒ äžæ°ã«èªãïŒåŸæ»ãããªãïŒ é床 é ã éã ReDoS èµ·ããåŸã èµ·ãã«ãã **ãæçããããããåŠå®æåã¯ã©ã¹ã**ã¯
æ£èŠè¡šçŸã®æ§èœæ¹åã«ãããå®ç³ã§ããã
è©³çŽ°ã¯æ§èœãš ReDoSãåç §ã
æ£èŠè¡šçŸã䜿çšãããã¿ãŒã³ ãããã®äŸã瀺ãã
â» IgnoreCaseïŒå€§æåãšå°æåãåºå¥ããªãïŒãªãã·ã§ã³ãèšå®ããå¿
èŠãããã
â» æç« äžããæ€çŽ¢ããå Žåã¯ãååŸã«ã\bããä»äžããå¿
èŠãããã
ããŸããæ¥æ¬èªæç« äžã®å Žåã¯ãå®è¡æãECMAScript ãªãã·ã§ã³ãèšå®ããå¿
èŠãããã
| æ£èŠè¡šçŸ | |
|---|---|
| æ£èŠè¡šçŸ | "[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}" |
| æ£èŠè¡šçŸ | "([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([A-Z]{2,4}|[0-9]{1,3})(\]?)" |
è£è¶³ïŒã¡ãŒã«ã¢ãã¬ã¹ã®æ€èšŒã«æ£èŠè¡šçŸã䜿ããªãïŒ: åæèªèº«ã
衚çŸã§ããªãã±ãŒã¹ãããã§
åãè¶£æšãè¿°ã¹ãŠããããçŸåšã® .NET ã«ã¯æç¢ºãªä»£æ¿ãããã// æšå¥šïŒMailAddress ã«ä»»ããïŒRFC ã«æ²¿ã£ãè§£éïŒ bool ok = System.Net.Mail.MailAddress.TryCreate(input, out _); // ASP.NET Core / ããŒã¿æ³šé [EmailAddress] public string Email { get; set; }äžèšã®è¡šã® 2 çªç®ã®ãããªé·å€§ãªãã¿ãŒã³ã¯ã
- RFC 5322 ãæ£ãã衚çŸã§ããŠããªãïŒåŒçšç¬Šä»ãããŒã«ã«éšãªã©ïŒ
- TLD ã
{2,4}ã«æ±ºãæã¡ããŠããïŒ.museum.travelã«é察å¿ïŒ- ããã¯ãã©ãã¯ãççºããããïŒReDoS ã®ãªã¹ã¯ïŒ
ãšããäžéã®åé¡ãæ±ããã
ã圢åŒã劥åœãããå³å¯ã«å€å®ããæå³ã¯èãã
æçµçã«ã¯ç¢ºèªã¡ãŒã«ãéããããªããšããã®ãçŸåšã®åæã§ããã
â» äžèšã¯ãåæ¹åç §ãæå°ãããã䜵çšããŠããã
| æ£èŠè¡šçŸ | |
|---|---|
| æ£èŠè¡šçŸ |
"href\s*=\s*(?:(?<quot>[\"'])(?<url>.*?)\k<quot>)"âãã¯ã©ãŒããŒã·ã§ã³ç¡ãããèæ ®ããŠããªãäŸã |
| æ£èŠè¡šçŸ |
"href\s*=\s*(?:\"(?<1>[^\"]*)\"|(?<1>\S+))"âãã·ã³ã°ã« ã¯ã©ãŒããŒã·ã§ã³ããèæ ®ããŠããªãäŸã |
â» äžèšã¯ãåæ¹åç
§ãæå°ãããã䜵çšããŠããã
â» å®è¡æãSinglelineïŒã.ãã«ã\n ãå«ããïŒãªãã·ã§ã³ãèšå®ããå¿
èŠãããã
| æ£èŠè¡šçŸ | |
|---|---|
| æ£èŠè¡šçŸ | "<(h[1-6])\b[^>]*>(.*?)</\1>" |
â» äžèšã¯ãåæ¹åç
§ãæå°ãããã䜵çšããŠããããŸããurlãtext ãªã©ã®éšåãã£ããã£ãè¡ãªã£ãŠããã
â» å®è¡æãIgnoreCaseïŒå€§ / å°æåãåºå¥ããªãïŒãSinglelineïŒã.ãã«ã\n ãå«ããïŒãªãã·ã§ã³ãèšå®ããå¿
èŠãããã
| æ£èŠè¡šçŸ | |
|---|---|
| æ£èŠè¡šçŸ | "<a\s+[^>]*href\s*=\s*(?:(?<quot>[\"'])(?<url>.*?)\k<quot>|(?<url>[^\s>]+))[^>]*>(?<text>.*?)</a>" |
è£è¶³ïŒHTML ã®è§£æã«æ£èŠè¡šçŸã䜿ããªãïŒ: äžèš 3 ã€ã¯ãããã
HTML ãæ£èŠè¡šçŸã§è§£æããäŸã ããããã¯å žåçãªã¢ã³ããã¿ãŒã³ã§ãããHTML ã¯æ£èŠèšèªã§ã¯ãªãïŒå ¥ãåæ§é ãæã€ïŒããã
æ£èŠè¡šçŸã§ã¯åççã«æ£ããè§£æã§ããªããå®éãäžèšã®äŸã
- 屿§å€äžã®
>ãã³ã¡ã³ã<!-- -->ã<script>å ã®ããã¹ã- 屿§ã®é åºéããæ¹è¡ãæã屿§
- å ¥ãåã®
<h1>ãäžæ£ãªéãã¿ã°ã§å®¹æã«ç Žç¶»ãããåæã泚èšã§
ãããèæ ®ããŠããªãäŸããšéçãæç€ºããŠããéãã§ãããçŸåšã® .NET ã§ã¯ãHTML ããŒãµãŒã䜿ãã
ã©ã€ãã©ãª ç¹åŸŽ AngleSharp W3C æºæ ãCSS ã»ã¬ã¯ã¿ãŒãDOM API HtmlAgilityPack å€åãXPath ã§èŸ¿ãããå£ãã HTML ã«å¯å®¹ var doc = await new HtmlParser().ParseDocumentAsync(html); var urls = doc.QuerySelectorAll("a[href]").Select(a => a.GetAttribute("href"));ãäœ¿ãæšãŠã®ã¹ã¯ãªããã§ãå ¥åã®åœ¢ãå®å šã«åãã£ãŠãããå Žåãé€ãã
HTML ã«ã¯æ£èŠè¡šçŸã䜿ããªãã
â» æå°ãããã䜿çšããŠããããŸãããããã³ã«ãããŒãçªå·ãªã©ã®éšåãã£ããã£ãè¡ãªã£ãŠããã
| æ£èŠè¡šçŸ | |
|---|---|
| æ£èŠè¡šçŸ | "^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/" |
è£è¶³: URL ã®åè§£ãã
System.Uriã䜿ãã®ã確å®ã§ãããif (Uri.TryCreate(s, UriKind.Absolute, out var uri)) { var proto = uri.Scheme; // "https" var port = uri.Port; // 443ïŒçç¥æãæ¢å®å€ãå ¥ãïŒ var host = uri.Host; }ã¯ãšãªæååã®è§£æã«ã¯
Microsoft.AspNetCore.WebUtilities.QueryHelpersã
System.Web.HttpUtility.ParseQueryStringã䜿ãã
æ£èŠè¡šçŸã®åŠçã«å©çšãã API ãšããã®ãªãã·ã§ã³ã«ã€ããŠèª¬æããã
æ£èŠè¡šçŸã«ãŠäžå¿ç圹å²ãæ ãã¯ã©ã¹ã«Regex ã¯ã©ã¹ãšMatch ã¯ã©ã¹ãããã
Regex ã¯ã©ã¹ã¯ãæ£èŠè¡šçŸãã¿ãŒã³ãæ ŒçŽãããã¿ãŒã³ ãããã³ã°ãå®è¡ããã¡ãœãããåããã¯ã©ã¹ã§ããã
ãã®ãªããžã§ã¯ããããã£ããã£æååã®å€ãåãåºããŠãåŒãç¶ãããæç¶ãåã®åŠçããå®è£
ã§ããã
- 以äžã«ãRegex ã¯ã©ã¹ã®äž»èŠãªãããã㣠/ ã¡ãœãããäžèЧããã
| é çª | åºå | åå | 説æ |
|---|---|---|---|
| 1 | ãããã㣠| ||
| 1-1 | ãããã㣠| Options | Regex ã³ã³ã¹ãã©ã¯ã¿ã«æž¡ããããªãã·ã§ã³ïŒãªãã·ã§ã³ãåç §ïŒ |
| 2 | ã¡ãœãã | ||
| 2-1 | ã¡ãœãã | IsMatch | æ£èŠè¡šçŸãšäžèŽãã察象ãå
¥åæååå
ã§èŠã€ãã£ããã©ããã瀺ãã äž»ã«ãå ¥åãã§ãã¯ãå®è£ ããå Žåã«å©çšããå ¥åãã§ãã¯ã§ã¯ã æ£èŠè¡šçŸã®å é ãšæ«å°Ÿã«ã ^ ããšã $ ããä»äžããŠäžéããã®ããããæåŠãããšè¯ãã |
| 2-2 | ã¡ãœãã | Match | å
¥åæåå
ã§æ£èŠè¡šçŸãšäžèŽãã察象ãïŒã€æ€çŽ¢ããçµæãMatch ãªããžã§ã¯ããšããŠè¿ãã ååŸããMatch ãªããžã§ã¯ãã® NextMatch ã¡ãœããïŒåŸè¿°ïŒãåŒã³åºãããå Žåãæ¬¡ã®çµæãMatch ãªããžã§ã¯ããšããŠè¿ãã |
| 2-3 | ã¡ãœãã | Matches | å
¥åæååå
ã§æ£èŠè¡šçŸãšäžèŽãã察象ããã¹ãŠæ€çŽ¢ãã çµæã®è€æ°ã®Match ãªããžã§ã¯ãïŒèŠã€ãã£ã察象ããã¹ãŠè¿ãïŒã MatchCollection ãšããŠè¿ãã |
| 2-4 | ã¡ãœãã | Replace | 第äžåŒæ°ã®æ£èŠè¡šçŸãã¿ãŒã³ã«äžèŽããæååãã第äºåŒæ°ã®çœ®æãã¿ãŒã³ã§çœ®æããã 第äºåŒæ°ã«ã¯ MatchEvaluator ããªã²ãŒãã䜿çšããŠçœ®æïŒå€æïŒããããšãã§ããïŒåŸè¿°ïŒã |
| 2-5 | ã¡ãœãã | Split | å ¥åæååããæ£èŠè¡šçŸã«ãã£ãŠå®çŸ©ãããŠããäœçœ®ã§é åã«åå²ããã |
ç§»è¡ã¡ã¢ïŒæ£èª€ïŒ: 2-1 ã®ãå ¥åãã§ãã¯ã§ã¯
^ãš$ãä»äžãã¯ã
$ãæ«å°Ÿã®\nã®åã«ãäžèŽãããããå³å¯ã«ã¯äžååã§ãã
ïŒåè¿°ã®æ¹èšãåç §ïŒã
å ¥åãã§ãã¯ã§ã¯\Aãš\zãäœ¿ãæ¹ã確å®ã§ããã
- ãªããžã§ã¯ãéå±€ã¯æ¬¡ã®ããã«ãªã£ãŠããã
- Matches ã¡ãœããã§ååŸã§ãã MatchCollection ãªããžã§ã¯ã
- Match ã¡ãœããã§ååŸã§ããMatch ãªããžã§ã¯ã
ãªããžã§ã¯ãå ïŒ äžäœãªããžã§ã¯ãã®ååŸæ¹æ³ ïŒ ãã£ããã£æååã®è©³çްããŒã¿
MatchCollectionãªããžã§ã¯ã ïŒ ã€ã³ãã¯ãµïŒçªå·ïŒ
â Matchãªããžã§ã¯ã ïŒ Groupsããããã£
ãâ GroupsCollectionãªããžã§ã¯ã ïŒ ã€ã³ãã¯ãµïŒçªå·ãåç§°ïŒ
ããâ Groupsãªããžã§ã¯ã ïŒ Capturesããããã£
ããâ CaptureCollectionãªããžã§ã¯ã ïŒ ã€ã³ãã¯ãµïŒçªå·ïŒ
ãããâ Captureãªããžã§ã¯ã ïŒ åçš®ããããã£
ãããã⣠ValueïŒstringïŒ ïŒ ãã£ããã£æååã®å€
ãããã⣠LengthïŒintïŒ ïŒ ãã£ããã£æååã®æååé·
ããããâ IndexïŒintïŒ ïŒ å
¥åæååãåºã«ããäœçœ®ïŒã€ã³ããã¯ã¹ïŒ
ç§»è¡ã¡ã¢ïŒèª€èšïŒ: åæã®ããã£ããã£æååã®é·æååãã¯
æååé·ã®èª€èšãšå€æãä¿®æ£ããã
- å ¶ã ã®ãªããžã§ã¯ãã®èª¬æ
| é çª | ãªããžã§ã¯ãå | 説æ |
|---|---|---|
| 1 | Match ãªããžã§ã¯ã | æ£èŠè¡šçŸã«ãããæ€çŽ¢ãããïŒã€ã®æååããšå¯Ÿå¿ããçµæãæ ŒçŽã |
| 2 | Groups ãªããžã§ã¯ã | äžèšãæ€çŽ¢æååãã®ãã£ããã£ãã°ã«ãŒãåã«ãã远å ãã£ããã£ã®æ å ±ãæ ŒçŽã |
| 3 | Capture ãªããžã§ã¯ã | ãã£ããã£æååã®è©³çްããŒã¿ãæ ŒçŽ |
-
ïŒã€ã®ã°ã«ãŒããè€æ°ã®æååããã£ããã£ããäŸ
æ£èŠè¡šçŸã«ãã£ãŠã¯ãïŒã€ã®ã°ã«ãŒããè€æ°ã®æååããã£ããã£ããããšãããã
ãã®ãããªæ£èŠè¡šçŸã®äŸã以äžã説æããã- æ£èŠè¡šçŸã®äŸ
| æ£èŠè¡šçŸ | "(123)(\d)+(789)" |
| å ¥åæåå | "123456789-123456789" |
- äžèšãå®è¡ããçµæã
以äžã®ãªããžã§ã¯ããè¿ãããã-
Match ãªããžã§ã¯ãïŒïŒã€ïŒ
ã»åã® "123456789" ã«ããã
ã»åŸãã® "123456789" ã«ããã - Groups ãªããžã§ã¯ãïŒïŒã€ïŒ
ã»å šäœïŒ123456789ïŒã®ãã£ããã£
ã»ã°ã«ãŒã 1ïŒ123ïŒã®ãã£ããã£
ã»ã°ã«ãŒã 2ïŒ"\d"=4ïŒã®ãã£ããã£
ã»ã°ã«ãŒã 3ïŒ"\d"=5ïŒã®ãã£ããã£
ã»ã°ã«ãŒã 4ïŒ"\d"=6ïŒã®ãã£ããã£
ã»ã°ã«ãŒã 5ïŒ789ïŒã®ãã£ããã£
-
Match ãªããžã§ã¯ãïŒïŒã€ïŒ
ç§»è¡ã¡ã¢ïŒæ£èª€ïŒ: åæã®èšè¿°ã¯ããäžæ£ç¢ºãªã®ã§è£è¶³ããã
- ãGroups ãªããžã§ã¯ãïŒïŒã€ïŒããšãããã
åæãããŠããã®ã¯ 6 ä»¶ã§ãããæ°ãåããªãã- ãŸããæ£èŠè¡šçŸ
(123)(\d)+(789)ã®ã°ã«ãŒã㯠3 ã€ã§ããã
ã°ã«ãŒã 4ã»5 ã¯ååšããªããå®éã®æåã¯æ¬¡ã®éãã§ããŸãã«ããã
æ¬ç¯ã説æããããšããŠããCapturesã®æçŸ©ã§ãããGroups[0] = "123456789" ïŒå šäœïŒ Groups[1] = "123" Groups[2] = "6" â Value ã¯ãæåŸã®ããã£ããã£ã ã Groups[2].Captures = ["4", "5", "6"] â 3 ååãã¹ãŠãããã«æ®ã Groups[3] = "789"èŠç¹:
(\d)+ã®ããã«éæå®åã®ä»ããã°ã«ãŒãã¯
è€æ°åãã£ããã£ããããGroup.Valueã¯æåŸã® 1 åããè¿ããªãã
ãã¹ãŠãåãåºãã«ã¯Group.Capturesãåæããã
ïŒåæããã°ã«ãŒã 2ã4ããšæžããã®ã¯ããã® 3 ååã®
ãã£ããã£ãæãæå³ã ã£ããšèªãããïŒ
- MatchEvaluator ããªã²ãŒãã䜿çšããŠçœ®æïŒå€æïŒããäŸ
- ãŸããRegex.Replace ( ) ã¡ãœããã®ç¹æ®ãªäœ¿ãæ¹ã«ã
MatchEvaluator ããªã²ãŒãã䜿çšãã眮æïŒå€æïŒæ¹æ³ãããã - ããã䜿çšãããšãéæç¶ã®ã眮æãã¿ãŒã³ãã䜿çšãã眮æïŒå€æïŒã§ã¯ãªãã
æç¶ãåèšèªïŒC#ãVBïŒã䜿çšãã眮æïŒå€æïŒãå¯èœã«ãªãã
- ãŸããRegex.Replace ( ) ã¡ãœããã®ç¹æ®ãªäœ¿ãæ¹ã«ã
public class Test_Regex {
// æ£èŠè¡šçŸã䜿çšããŠçœ®æïŒå€æïŒããã¡ãœãã
public string Regex_Replace(string yyyymmdd)
{
// æ¥ä»ïŒyyyy/mm/dd圢åŒïŒãæ£èŠè¡šçŸãçšããŠïŒæ¥å¢ãã
return Regex.Replace(yyyymmdd,
@"(?<year>\d{4})/(?<month>\d{2})/(?<day>\d{2})",
new MatchEvaluator(this.IncrementDay));
}
// MatchEvaluatorããªã²ãŒãã¡ãœãã
private string IncrementDay(Match m)
{
// æ¥ä»ã¯ãŒã¯
DateTime dt;
// æ¥ä»ïŒyyyy/mm/dd圢åŒïŒãDateTimeåã«å€æ
if (DateTime.TryParse(m.Value, out dt)) {
// DateTimeã¯ã©ã¹ã䜿çšããŠïŒæ¥å¢ããã
// æ¥ä»ïŒyyyy/mm/dd圢åŒïŒã«æ»ãã
return dt.AddDays(1).ToShortDateString();
}
else {
// 倿ã§ããªãã£ãå Žåãäœãããªãã§æ»ãã
return m.Value;
}
}
}è£è¶³ïŒMatchEvaluator ã¯ãéãéããšããŠéèŠïŒ: æ£èŠè¡šçŸã ãã§ã¯
衚çŸã§ããªã倿ïŒèšç®ãèŸæžåŒããæ¡ä»¶åå²ïŒãå¿ èŠã«ãªã£ããšãã
ç¡çã«æ£èŠè¡šçŸãè€éåããããã®æ¹åŒã«åãæ¿ããã®ãå®ç³ã§ãããçŸåšã¯ã©ã ãåŒã§ç°¡æœã«æžããã
var s = Regex.Replace(input, @"\d{4}/\d{2}/\d{2}", m => DateTime.TryParse(m.Value, out var d) ? d.AddDays(1).ToString("yyyy/MM/dd") : m.Value);ãªãäžèšã®åæã®äŸã§äœ¿ãããŠãã
ToShortDateString()
ã¯ã«ã«ãã£äŸåïŒå®è¡ç°å¢ã®å°åèšå®ã§æžåŒãå€ããïŒããã
æžåŒãåºå®ããããªãToString("yyyy/MM/dd")ãæç€ºããæ¹ãããã
Match ã¯ã©ã¹ã¯ãRegex ã¯ã©ã¹ã§å®è¡ããããã¿ãŒã³ ãããã³ã°ã®çµæãæ ŒçŽããã¯ã©ã¹ã§ããã
- 以äžã«ãMatch ã¯ã©ã¹ã®ãããã㣠/ ã¡ãœãããäžèЧããã
| é çª | åºå | åå | 説æ |
|---|---|---|---|
| 1 | ãããã㣠| ||
| 1-1 | ãããã㣠| Success | äžèŽãã察象ãèŠã€ãã£ããã©ããã瀺ã bool å€ãååŸããã äŸãã°ãéæå®åã * ããæå®ããã°ã«ãŒãæ§æäœã¯ãèŠã€ãããªãããšãæãåŸãã |
| 1-2 | ãããã㣠| Groups | æ£èŠè¡šçŸã«ãããæ€çŽ¢æååãã® ã»ãã£ããã£ïŒã°ã«ãŒãïŒïŒã ã»ã°ã«ãŒãåã«ãã远å ãã£ããã£ïŒã°ã«ãŒãïŒ ïœ ïŒ ã®æ å ±ãæ ŒçŽã |
| 1-3 | ãããã㣠| Captures | ã°ã«ãŒãïŒã®ãã£ãã㣠|
| 1-4 | ãããã㣠| Value | ã°ã«ãŒãïŒã®ãã£ããã£æååã®å€ |
| 1-5 | ãããã㣠| Length | ã°ã«ãŒãïŒã®ãã£ããã£æååã®æååé· |
| 1-6 | ãããã㣠| Index | ã°ã«ãŒãïŒã®å ¥åæååãåºã«ããäœçœ®ïŒã€ã³ããã¯ã¹ïŒ |
| 2 | ã¡ãœãã | ||
| 2-1 | ã¡ãœãã | NextMatch | 次ã®çµæã Match ãªããžã§ã¯ããšããŠè¿ãã |
| 2-2 | ã¡ãœãã | Result | æå®ããã眮æãã¿ãŒã³ãè¿ãïŒçµææ¯ã«çœ®æãã¿ãŒã³ã倿Žã§ããïŒã |
è£è¶³ïŒã¢ãã±ãŒã·ã§ã³ãé¿ããæ° APIïŒ:
Match/Groupã¯
ããããstringãçæããããã倧éåŠçã§ã¯ç¢ºä¿ãç©ã¿äžããã.NET 7 以éã§ã¯ã
Span<char>ããŒã¹ã® API ã远å ãããŠããã
API å 容 Regex.EnumerateMatches(ReadOnlySpan<char>)æååãäœããã«äœçœ®ãšé·ãã ãåæ Regex.Count()äžèŽæ°ã ããæ°ããïŒ.NET 7+ïŒ ValueMatchIndexãšLengthã®ã¿ãæã€æ§é äœforeach (var m in Regex.EnumerateMatches(span, pattern)) Process(span.Slice(m.Index, m.Length)); // æååçæãªã
以äžãRegex ã¯ã©ã¹ã®ãªãã·ã§ã³ã«ã€ããŠèª¬æããã
ããã«ãã£ãŠäžéšãåäœïŒåŠççµæïŒã倿Žãããã
| é çª | RegexOptions åæäœã®ã¡ã³ã | 説æ |
|---|---|---|
| 1 | None | ãªãã·ã§ã³ãäœãèšå®ãããªãããšãæå®ããã |
| 2 | ECMAScript | ECMAScript æºæ ã®åäœãšãããäžéšã®ã¡ã¿æåã®æå³ã倿Žãããã ã»ECMAScript ã®æšæºäžèŽã®åäœ ãhttps://learn.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expression-options |
| 3 | Singleline | ã¯ã€ã«ãã«ãŒãã§ãã .ïŒããªãªãïŒã®æå³ããã\nããå«ãããã¹ãŠã®æåã®æå³ã«å€æŽããã |
| 4 | Multiline | ã^ããšã$ãã®æå³ãã»ã ^ãïŒãæååã®å
é ã â ãè¡ã®å
é ãã»ã $ãïŒãæååã®æ«å°Ÿã â ãè¡ã®æ«å°Ÿãã«å€æŽããã ã ^ããšã$ãã®ä»£ããã«ã\Aããšã\Zãã䜿çšãããšãMultiline ã®åœ±é¿ãåããã«ãæååã®å é ãããæååã®æ«å°Ÿããæå®ã§ããã |
| 5 | IgnoreCase | 倧æåãšå°æåãåºå¥ããªãã |
| 6 | CultureInvariant | èšèªïŒã«ã«ãã£ïŒã®éããç¡èŠããã ã»RegularExpressions åå空éã§ã®ã«ã«ãã£ãèªèããªãæäœã®å®è¡ ãhttps://learn.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expression-options |
| 7 | RightToLeft | æ€çŽ¢ãå·Šããå³ïŒâïŒã§ã¯ãªãå³ããå·ŠïŒâïŒã«è¡ãããããã«æå®ããã |
| 8 | Compiled | æ£èŠè¡šçŸãã³ã³ãã€ã«ããŠå®è¡é床ãäžããããã ããèµ·åæéã¯é·ããªãã ã»æ£èŠè¡šçŸã«ãããã³ã³ãã€ã«ãšåå©çš ãhttps://learn.microsoft.com/ja-jp/dotnet/standard/base-types/compilation-and-reuse-in-regular-expressions |
| 9 | ExplicitCapture | æç€ºçã«ååãæå®ãããã°ã«ãŒãã ããæå¹ãªãã£ããã£ã§ããããšãæå®ããã |
| 10 | IgnorePatternWhitespace | ã»æ£èŠè¡šçŸã®ãã¿ãŒã³å
ã«ã³ã¡ã³ãæãèšè¿°ããã«ã¯ïŒïŒ»C#ãVB - ïŒ IT ãhttp://www.atmarkit.co.jp/fdotnet/dotnettips/582regexcomment/regexcomment.html |
è£è¶³ïŒçŸåšè¿œå ããããªãã·ã§ã³ïŒææ°åïŒ: äžèšã«å ããŠã
çŸåšã¯æ¬¡ã® 2 ã€ãéèŠã§ããã
ãªãã·ã§ã³ å 容 NonBacktrackingïŒ.NET 7+ïŒããã¯ãã©ãã¯ããªããšã³ãžã³ã䜿ããReDoS ãåççã«é²ã RegexOptions.CompiledçŸåšãæå¹ã ãããœãŒã¹çæã®æ¹ãäžäœ
NonBacktrackingã¯å ¥åé·ã«å¯ŸããŠç·åœ¢æéãä¿èšŒãã
ïŒãªãŒãããã³æ¹åŒã®ãšã³ãžã³ã䜿ãïŒã
ãã ãåŸæ¹åç §ã»å èªã¿/åŸèªã¿ã䜿ããªããšããå¶çŽãããã// ä¿¡é Œã§ããªãå ¥åãæ±ããªãããããæãå®å š new Regex(pattern, RegexOptions.NonBacktracking);
è£è¶³ïŒ
[GeneratedRegex]ïŒçŸåšã®æšå¥šåœ¢ïŒææ°åïŒ: .NET 7 以éã
ãœãŒã¹ ãžã§ãã¬ãŒã¿ãŒã«ããæ£èŠè¡šçŸã䜿ãããpublic partial class Validator { [GeneratedRegex(@"\A[a-z0-9_]+\z", RegexOptions.IgnoreCase)] private static partial Regex UserName(); public bool IsValid(string s) => UserName().IsMatch(s); }
æ¹åŒ çæã¿ã€ãã³ã° èµ·å å®è¡ AOT new Regex(...)ïŒè§£éïŒå®è¡æ éã é ã â RegexOptions.Compiledå®è¡æã« IL çæ é ã éã à [GeneratedRegex]ã³ã³ãã€ã«æã« C# çæ éã éã â
[GeneratedRegex]ãå šé¢çã«åªããŠãã
ïŒèµ·åãéããå®è¡ãéããããªãã³ã°/Native AOT ã§ãåãã
çæããã C# ã³ãŒãããããã°ã§è¿œããïŒã
éçãªãã¿ãŒã³ã«ã¯ãããã䜿ãã®ãçŸåšã®ç¬¬äžåè£ã§ããããªããåçã«çµã¿ç«ãŠããã¿ãŒã³ã«ã¯äœ¿ããªãããã
ãã®å Žåã¯Regexã€ã³ã¹ã¿ã³ã¹ãstatic ãã£ãŒã«ãã«ãã£ãã·ã¥ãã
ïŒæ¯ånewããããããã¯éçã¡ãœããRegex.IsMatch(s, pattern)ã
ã«ãŒãå ã§åŒã¶ã®ã¯é¿ããïŒã
è£è¶³ïŒåæã«ç¡ãç¯ãçŸåšã¯å¿ é ã®ç¥èïŒ: æ¬ããŒãžå·çæç¹ã§ã¯
話é¡ã«ãªã£ãŠããªãã£ãããæ£èŠè¡šçŸã«ã¯
**ReDoSïŒRegular expression Denial of ServiceïŒ**ãšãã
ã»ãã¥ãªãã£äžã®åé¡ããããåç: ããã¯ãã©ãã¯åã®ãšã³ãžã³ã¯ã
äžèŽããªãå ¥åã«å¯ŸããŠãã¹ãŠã®åå²ã詊ãããšãããã
å ¥åé·ã«å¯ŸããŠææ°é¢æ°çã«æéããããå Žåãããã// å±éºãªãã¿ãŒã³ïŒãå ¥ãåã®éæå®åãïŒ var re = new Regex(@"^(a+)+$"); re.IsMatch(new string('a', 30) + "!"); // æ°åç§ãããªãŒãº
aã 1 åå¢ããããšã«è©Šè¡åæ°ãåå¢ããã
æ»æè ãå ¥åãéããç®æïŒãã©ãŒã ãURLãããããŒïŒã§
ãã®ãããªãã¿ãŒã³ã䜿ããšãCPU ãå æãããŠãµãŒãã¹ãæ¢ãŸããå±éºãªãã¿ãŒã³ã®å å:
圢 äŸ å ¥ãåã®éæå®å (a+)+ã(a*)*ã(.*)*éãªãåãéžæè¢ (a|a)*ã(a|ab)+æçããã + è²ªæ¬²ã®æ··åš .*?.*察çïŒäžããé ã«æ€èšããïŒ:
察ç å 容 ããããæ£èŠè¡šçŸã䜿ããªã ã¡ãŒã«â MailAddressãURLâUriãHTMLâããŒãµãŒRegexOptions.NonBacktrackingç·åœ¢æéãä¿èšŒïŒ.NET 7+ïŒ ã¿ã€ã ã¢ãŠããèšå®ãã new Regex(p, opts, TimeSpan.FromSeconds(1))åŠå®æåã¯ã©ã¹ã䜿ã .*?ãã[^"]*ã¢ããã㯠ã°ã«ãŒã (?>a+)+ã§åŸæ»ããçŠæ¢å ¥åé·ãå¶éãã æ€èšŒåã«é·ãã§åŒŸã ã¿ã€ã ã¢ãŠãã®æå®ã¯ãå€éšå ¥åãæ±ããã¹ãŠã®
Regexã§
äºå®äžå¿ é ã§ãããæå®ããªããšæ¢å®ã¯ç¡éïŒInfiniteMatchTimeoutïŒãprivate static readonly Regex _re = new(pattern, RegexOptions.None, TimeSpan.FromMilliseconds(200));è¶ éãããš
RegexMatchTimeoutExceptionãéåºãããã®ã§ã
ææããŠãäžæ£ãªå ¥åããšããŠæ±ãããªããåæã®ãŸãšããææãã
ãåŠ¥åœæ§ã®æ€èšŒãå°é£ããšããè«ç¹ã¯ã
ãã® ReDoS ã®ååšã«ãã£ãŠäžå±€éã¿ãå¢ããŠããã
ãåãããšãã ãã§ãªããäžèŽããªãå ¥åã§æŽèµ°ããªãããšãã
ãã¹ãã®å¯Ÿè±¡ã«ãªãã
æ£èŠè¡šçŸã䜿çšãããšãé«åºŠãªã
- å ¥åãã§ãã¯
- å šææ€çŽ¢
- 眮æïŒä»å ãåé€ãæžåŒå€æŽïŒ
- æåååå²
ãªã©ã®åŠçããé«ãçç£æ§ã§å®è£ ããããšãã§ããã
ãã ãã以äžã®ç¹ã¯ãæ£èŠè¡šçŸã«ãã解決ã§ããªãã
以äžã®ããã«é£è§£ãªãããåŠ¥åœæ§ã®æ€èšŒãå°é£ã§ããã
-
èšè¿°ïŒåŠçã®å®è£ ã¹ãããæ°ïŒã¯ãçãããªããã
- æ£èŠè¡šçŸãç¿åŸããå¿ èŠãããã
- ã¢ãµã€ã³ããæè¡è ã«ã¯æ£èŠè¡šçŸã®ç¥èãå¿ èŠã«ãªãã
-
ãéæç¶ãèšèªãã®ç¹åŸŽãšããŠãéçºããã¹ãããæ°ã«å¯Ÿãããã¹ã ã±ãŒã¹ãå€ãã
- ãããæ€èšŒãããã¹ãå·¥æ°ã®åæžã¯ã§ããªããã
- ãã¹ãã±ãŒã¹ãç¶²çŸ çã§ãããã©ãããã«ãã¬ãŒãžãææšã«å©çšã§ããªãã
è£è¶³ïŒãã®ææã¯çŸåšãæå¹ïŒ: ã1 è¡ã®ã³ãŒãã ãã
ã«ãã¬ããžã§ã¯ 1 è¡ãšããŠããæ°ããããªãããšããææã¯æ¬è³ªçã§ãããç·©åçãšããŠã¯ã
ææ®µ å 容 IgnorePatternWhitespaceã§ã³ã¡ã³ããæžããã¿ãŒã³èªäœãèªããããã«ãã [GeneratedRegex]çæã³ãŒããã¹ãããå®è¡ã§è¿œãã å¢çå€ã®ãã¹ããæç€ºçã«åæ äžèŽããäŸã»äžèŽããªãäŸã®äž¡æ¹ regex101.com çã§ã®å¯èŠå ãããéçšã確èªãã // x ã¢ãŒãïŒãã¿ãŒã³ã«ã³ã¡ã³ããå ¥ãã [GeneratedRegex(""" \A # å é (?<user>[\w.+-]+) # ããŒã«ã«éš @ (?<host>[\w-]+(\.[\w-]+)+) # ãã¡ã€ã³ \z # æ«å°Ÿ """, RegexOptions.IgnorePatternWhitespace)] private static partial Regex Mail();
- ãæç¶ãèšèªãã§å®è£
ããªããšè¡šçŸã§ããªãã±ãŒã¹ãããã
äŸãã°ãã¡ãŒã« ãã©ãŒããã ãã§ãã¯ãªã©ãäŸã«æããŠèª¬æãããšã- RFC ã«æºæ ããã¡ãŒã« ã¢ãã¬ã¹ã ãèš±å¯ããã®ãïŒ
- æºåž¯ã¡ãŒã«ãªã©ã«èŠããã RFC éæºæ ã®ã¡ãŒã« ã¢ãã¬ã¹ãèš±å¯ããã®ãïŒ
- ãŸããé»åã¡ãŒã«ã®é éå IP ã¢ãã¬ã¹ã®çŽæ¥æå®ãèš±å¯ããã®ãïŒãªã©ã
- æ£èŠè¡šçŸã¯ã
- å ¥åãã§ãã¯åŠçãã
- 眮æïŒæžåŒå€æŽïŒãªã©ã®
å ±éåŠçããæ¯èŒç容æã«éçºã§ããã
- ããããå©äŸ¿æ§ãšæ±çšæ§ãäž¡ç«ãã API 仿§ãæ€èšããããšã¯å€ãããé£ããã
ãã®ããã匷床ãäžãããªããæ±çšæ§ãç ç²ã«ãã以å€ã«æ¹æ³ãç¡ãã
è£è¶³ïŒçµè«ïŒ: æ¬ããŒãžå šäœãéããå®åäžã®æéãçºããã
- å°çšã®åããããã®ã«ã¯ãæ£èŠè¡šçŸã䜿ããªã
ïŒã¡ãŒã« âMailAddressãURL âUriãæ¥ä» âDateTime.TryParseã
HTML/XML/JSON â åããŒãµãŒïŒ- éçãªãã¿ãŒã³ã¯
[GeneratedRegex]- å€éšå ¥åãæ±ããªããã¿ã€ã ã¢ãŠãã
NonBacktracking.*?ããåŠå®æåã¯ã©ã¹[^x]*- ãã£ããã£äžèŠãªã
(?:)ãååãšçªå·ãæ··ããªã- äžèŽããªãå ¥åã®ãã¹ããæžãïŒæ§èœãå«ããŠïŒ
-
.NET ã®æ£èŠè¡šçŸ
https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expressions -
æ£èŠè¡šçŸã®åºæ¬ - .NET Tips (VB.NET,C#...)
http://dobon.net/vb/dotnet/string/regex.html -
æ£èŠè¡šçŸ (System.Text.RegularExpressions)
Programming/.NET Framework - ç·æŠãœãããŠã§ã¢æšé²æ
http://smdn.jp/programming/netfx/regex/ -
ãµã«ã«ããããæ£èŠè¡šçŸå ¥é
http://www.mnet.ne.jp/~nakama/ -
Regular-Expressions.info
Regex Tutorial, Examples and Reference - Regexp Patterns
http://www.regular-expressions.info/index.html
- .NET æ£èŠè¡šçŸãœãŒã¹ ãžã§ãã¬ãŒã¿ãŒ
https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expression-source-generators - æ£èŠè¡šçŸã®ãã¹ã ãã©ã¯ãã£ã¹
https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/best-practices-regular-expressions - ããã¯ãã©ããã³ã°
https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/backtracking-in-regular-expressions
Tags: ç§»è¡, .NETéçº, ãã®ä»ãéçºã®è²ã