====== 正規表現 ======
===== 概要 =====
正規表現とは、文字列内で文字の組み合わせを照合するために用いられるパターンです。\\
参照:[[https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions|正規表現]]
例えば携帯電話の番号\\
090-1234-5678\\
080-2011-0702\\
etc…\\
3桁の数字-4桁の数字-4桁の数字\\
正規表現を使うと、1つの正規表現で全ての電話番号が検索ができる。
\d{3}-\d{4}-\d{4}
※正規表現も複雑過ぎるのを書かれるとメンテナンス出来なくなるので、書いた人は自己満足出来るけど、後の人や2ヶ月後の自分のことを気にしないとね。
===== 正規表現で使用する特殊文字 =====
下記の特殊文字をメタ文字といいます。\\
メタ文字を単なる普通の文字として検索したい場合は、メタ文字の前に「\」を付加します。
. ^ $ [ ] * + ? | ( )
===== 文字クラスの略記法 =====
良く使われる文字クラスには省略記法が存在します。\\
* \w 単語構成文字 [a-zA-Z0-9_]
* \W 非単語構成文字 [^a-zA-Z0-9_]
* \s 空白文字 [ \t\r\n\f\v]
* \S 非空白文字 [^ \t\r\n\f\v]
* \d 10進数字 [0-9]
* \D 非10進数字 [^0-9]
* \h 16進数字 [0-9a-fA-F]
* \H 非16進数字 [^0-9a-fA-F]
これらの「空白」「数字」などは ASCII の範囲の文字のみを対象としています。 いわゆる「全角アルファベット」「全角空白」「全角数字」などは ここの空白、数字、には含まれません。
===== 説明 =====
* [[https://qiita.com/yaju/items/1575375a126315326fc9|正規表現を理解してみる]]
* [[http://www.mnet.ne.jp/~nakama/|サルにもわかる正規表現入門]]
==== オンライン上の正規表現の確認サイト ====
=== 検索 ===
* [[https://regex101.com/r/q681jI/2/|Online regex tester and debugger: PHP, PCRE, Python, Golang and JavaScript(regex101)]]
* [[http://regexpal.com/|Regex Tester - Javascript, PCRE, PHP]]
* [[http://nelog.jp/regular-expression-online-tools|ブラウザから手軽にチェックできる正規表現テストツールまとめ]]
* [[http://tiri-tomato.hatenadiary.jp/entry/20111219/1324271441|正規表現でコマンドライン文字列を分割]]
* [[https://qiita.com/yucatio/items/e980550814f66b3450dd|正規表現の可視化ツールRegulexを使おう!]]
=== 置換 ===
* [[https://www.ipentec.com/utils/WebTextUtility/ReplaceText/|正規表現対応 文字列置換 Webアプリ / Webサービス]]
===== 覚えておくといいこと =====
==== 最長マッチと最短マッチ ====
「.*」 … なんでもいい文字の連続(最長)\\
正規表現 JR.*駅\\
対象文字 **JR静岡駅から浜松駅**まで\\
※可能な限り合致するまでヒットする\\
「.*?」 … なんでもいい文字の連続(最短)\\
正規表現 JR.*?駅\\
対象文字 **JR静岡駅**から浜松駅まで\\
※可能な限り少ない回数でヒットする\\
==== 後方参照 ====
正規表現を使って置換をする場合、正規表現でマッチした内容をそのまま使用したい場合がある、その場合に後方参照を使用する。\\
後方参照は、正規表現にて括弧で括られた分を「$」の後の数値を付けて「$1」などと記述する。
対象文字列 1234567890
正規表現 (\d\d\d\d)(\d\d)(\d\d\d\d)
置換文字列 $3-$1-$2
$1 = 1234
$2 = 56
$3 = 7890
結果 7890-1234-56
==== 含まない文字列 ====
Userを含まない行を抽出する。(?!.*対象文字列)を使う。 \\
[[http://www-creators.com/archives/1827|正規表現:文字列を「含まない」否定の表現まとめ]]
-- 複数行マッチのオプションとして「m」を付けている。
/^(?!.*User).*$/gm
net use aaa /User aaaaa ヒットしない
net use aaa xxxxx bbbbb ヒットする
==== 日付(月/日形式) ====
不明な場合、-(ハイフン)を入力、月/日 の入力形式を少し厳密に行う
-$|^(0[1-9]|1[0-2])\/(0[1-9]|[12][0-9]|3[01])$
参照:[[https://www.javadrive.jp/regex-basic/sample/index6.html|日付および時刻の正規表現]]
-$|(?
参照:[[https://www.tactsystem.co.jp/blog/post-540/|正規表現で日付を検索]]