[[FrontPage]] *概要 [#f077b186] -いろいろ非直感的なのでテスト駆動的に[[確認すること>http://rubular.com/]] -日本語に直すとよい *参考 [#s6cb480e] -[[練習用>https://alf.nu/RegexGolf]] -[[勉強用>https://qiita.com/jnchito/items/b0839f4f4651c29da408]] -[[簡易デバッガ>http://rubular.com/]][[デバッガ>https://regex101.com/]] *文法 [#bf9743d2] |記述|意味|例|h |.|任意の1文字|| |?|直前の文字があるかないかどちらか|| |^|文頭|| |$|文末|| |*|貪欲な1個以上マッチ|| |+|貪欲な1個以上マッチ|| |*?|控えめな0個以上マッチ|| |+?|控えめな1個以上マッチ|| |{n,m}|n個以上m個以下。{n,}でn個以上、{,m}でm個以下を表す|| |()|ひとまとまりとみなしてキャプチャ|| |(?:)|ひとまとまりとみなさずキャプチャ|| |[a-zA-Z0-9]|a-z, A-Z, 0-9の1文字|| |[ABC]|AもしくはBもしくはCの1文字|| |[^ABC]|A、B、Cのいずれでもない1文字|| |パイプ|パイプの前、もしくは後|ABCパイプDEFで、ABCとDEFにマッチする| |(?<=abc)|肯定の後読み。abcの後にマッチする|| |(?=abc)|肯定の先読み。abcの前にマッチする|| |(?<!abc)|否定の後読み。abcという文字列以外の直前の位置にマッチする|| |(?!abc)|否定の先読み。abcという文字列以外の直後の位置にマッチする|| |\b|単語の区切り目|ちなみに、\<と\>が「単語の先頭、末尾」にマッチ| |\w|英単語の構成文字|| |\s|空白文字|環境依存| |\d|数字|| |\B、\W, \S, \D|小文字の逆の意味|| |\1, \2, ...|キャプチャされた順にその文字列がそのまま入る|| *イディオム [#e4896c4e] -「かつ」を表す --「暗も黒も堕も闇も入っている」ような文字列にマッチ(順序は問わない) --^(?=.*暗)(?=.*黒)(?=.*堕)(?=.*闇) --https://qiita.com/liburari/items/dbcd0b8af3781d221424 *最短マッチ [#e5c9b941] -正規表現の*?は最短のマッチという意味になる -基本的に*ではなく*?のほうが最短マッチで探索打ち切りなので早くなる傾向 -正規表現の王道は、ちゃんとストラクチャっぽく書いてやること、そうじゃないと字面に騙されるので注意(だがめんどい) -キャプチャしない(:?)の中にキャプチャ()が入っている場合、キャプチャが優先される。要するに、グルーピングしたいけどキャプチャしたくはないよ、というときに使う (\s*\w)+とかのようにグルーピング必須のことはあるからね -正規表現には??みたいなやつがあって、これも最短一致。 -先読みとか後読みとかは、ただ「そこにあればよい」「そこになければよい」というマッチングなので注意 -JavaScriptでは正規表現を動的に作ることが出来る(当然) -正規表現を最短マッチで止める方法 --oniguruma では「マッチが成功する最短の文字列」を指定する機能(reluctant quantifier)があります。他の処理系でも割とあるようです --https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.html |