#1.REGEXとは
正規表現(RegExp/regex)とは、文字列のパターンを表現する表記法
/pattern/
#2. 良いREGEXと悪いREGEX
[2016-05-02T16:05:18 #92430] INFO -- : Served asset /navi/hu-0005-03/style.css - 304 Not Modified (1ms)
必要な情報
時間: 2016-05-02T16:05:18 #92430
種類: INFO
情報: Served asset /navi/hu-0005-03/style.css - 304 Not Modified (1ms)
1. \[(.*)\]\s+(.*)\s--\s:\s+(.*)
2. \[([12]\d{3}-[01]\d-[0-3]\dT[0-2]\d:[0-6]\d:[0-6]\d
+#\d+)\]\s+(.*)\s--\s:\s+(.*)
2つレゲックス patternを見ると、どれが良いですか、すぐに答えられます。
**基本的に、レゲックス pattern は長ければ長いほど良いです。**もちろん、正解なければなりません。
なぜは?
普通は、なんでも検索するとき、くわしく情報を入力すると、結果が正しくなって、時間もかからない。これも一緒。
#3.マッチする入力とマッチしない入力
1. [(.)]\s+(.)\s--\s:\s+(.)
2. [([12]\d{3}-[01]\d-[0-3]\dT[0-2]\d:[0-6]\d:[0-6]\d
+#\d+)]\s+(.)\s--\s:\s+(.)
[2016-05-02T16:05:18 #92430] INFO -- : Served asset /navi/hu-0005-03/style.css - 304 Not Modified (1ms)
(1)すべて文字を受けるように、(.) を使います-> マッチしない入力
(2)時間の詳細フォーマットを使います->マッチする入力
#4.良いREGEXと悪いREGEXの比較
\[(.*)\]\s+(.*)\s--\s:\s+(.*)
1−4ステップまで文字同じとき(マッチする入力)、一つステップがかかる。
しかし、ステップ 5のとき, .*をひかく(比較)した後で, 次の文字を検索するために、レゲックスは最後から最初までゆっくり検索しなければなりません。
ここで、158ステップに見えます。
マッチしない入力のじゃくてん(弱点)がすぐに見えます, うしろの文字は長ければ長いほどステップがかかります。時間もかかる
後ろの(. *) も同じ
すべては324 ステップがかかる。
\[([12]\d{3}-[01]\d-[0-3]\dT[0-2]\d:[0-6]\d:[0-6]\d+#\d+)\]\s+(.*)\s--\s:\s+(.*)
マッチする入力を使いますから、文字同じとき、一つステップがかかる。
それで、27 ステップに時間が検索することを完了しました。すべては158ステップがかかる。
実際に、まだ最良REGEXじゃない、改善できます。
#5.最良REGEX
(2)の間(.)にがあります。よくないです。改善できます。
\[([12]\d{3}-[01]\d-[0-3]\dT[0-2]\d:[0-6]\d:[0-6]\d +#\d+)\]\s+([A-Z]*)\s-+\s:\s+(.*)
(.)はpatternの最後にある時、大丈夫です、一つステップがかかる
#6.まとめ
良いregexを書くために:
-マッチする入力を使います。(ステップ数が減る)
- patternの間に(.*)を使わないようにする。