悪いREGEXと良いREGEXと最良REGEX

  • 4
    いいね
  • 0
    コメント

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+(.*)
Screen Shot 2016-05-21 at 16.01.39.png

Screen Shot 2016-05-21 at 16.03.35.png

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+(.*)​**
Screen Shot 2016-05-21 at 16.06.54.png

Screen Shot 2016-05-21 at 16.08.14.png

マッチする入力​を使いますから、文字同じとき、一つステップがかかる。
それで、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の間に(.*)を使わないようにする。​