[[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



トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS