コンテンツにスキップ

正規表現パターンメモ

最終更新日: 2021-04-02

パターンを思い付く都度に更新される予定。

yyyy-MM-dd HH-mm-ss を yyyy-m-d に変換

  • /(\d{4})-0?(\d{1,2})-0?(\d{1,2}).+/$1-$2-$3/

3 桁区切りカンマ

  • /(\d)(?=(\d{3})+(?!\d))/$1,/g
    • 直後に\d{4}でなく、\d{3}のパターンのある\d をキャプチャし、カンマを付与

ネストプロパティの 2 段目(bar)以降を配列に置換

  • /(?<=\$request->.+?)->((?<!--\$request--->)(?<=->)([a-z_]+))+/['$2']/gi
    1. まず(?<=\$request->.+?)はキャプチャされず、この次に->があるのが前提、->は削除するので先読み・後読み・キャプチャはしない
    2. 次に式などで文章が両辺にあることを考慮して、文字列内に\$request->が再度含まれないことを(?<!--\$request--->)として条件にする
      1. これを入れてないと一行中の一文と解釈されるので、別の文と解釈させるため
    3. 次にプロパティ名の前には->が来るので、それを(?<=->)として条件付けする
    4. 最後に([a-z_]+)でプロパティ名であろうものを指定する
    5. 2-4 の繰り返し(ルートにある 2 個目のカッコ)に対して置換を掛けることでプロパティ名を配列に置換できる
    6. 但し 1 で指定している->単体は繰り返し対象外なのに繰り返し適用されているが、この理由はよくわかってない
      1. 恐らく単純に(?<=\$request->.+?)の後ろにある->が全部消えている?
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// source text
$request->foo
$request->foo;
$request->foo->bar;
$request->foo['bar'];
$request->foo->bar->fb->fBfb;
$arr = [
  'bar' => $request->foo->bar
];
if ($request->foo->bar->fb= $request->foo->bar->fb) {
  $request->foo->bar->fb = $request->foo->bar->fb;
}

// replaced text
$request->foo
$request->foo;
$request->foo['bar'];
$request->foo['bar'];
$request->foo['bar']['fb']['fBfb'];
$arr = [
  'bar' => $request->foo['bar']
];
if ($request->foo['bar']['fb']= $request->foo['bar']['fb']) {
  $request->foo['bar']['fb'] = $request->foo['bar']['fb'];
}

但しメソッドは対象外にしたい場合

  • /(?<=\$request->.+?)->((?<!--\$request--->)(?<=->(?![a-z_]+\(\)))([a-z_]+))+/['$2']/gi
    • ->の後に来るメソッド構文を除外するために、(?![a-z_]+\(\))を追加
      • (?<=->(?![a-z_]+\(\)))とすることで->の後に来る(?![a-z_]+\(\))を除外しつつ、->の後に来る([a-z_]+)をキャプチャできる
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// source text
$request->foo
$request->foo;
$request->foo->bar;
$request->foo['bar'];
$request->foo->fooBar();
$request->foo->bar->fooBar();
$arr = [
  'bar' => $request->foo->bar
];
if ($request->foo->bar->fb= $request->foo->bar->fb) {
  $request->foo->bar->fb = $request->foo->bar->fb;
}

// replaced text
$request->foo
$request->foo;
$request->foo['bar'];
$request->foo['bar'];
$request->foo->fooBar();
$request->foo['bar']->fooBar();
$arr = [
  'bar' => $request->foo['bar']
];
if ($request->foo['bar']['fb']= $request->foo['bar']['fb']) {
  $request->foo['bar']['fb'] = $request->foo['bar']['fb'];
}

参考