個人的★正規表現チートシート

自分用に書いた regex をメモするだけ
※ syntax highlight は shell(sh)を指定。もっとよさげなのあったらおせーて

いちおう動作環境の想定は、VSCodeの正規表現オプションだけオンの状態。
単語一致と大文字小文字の区別はオフの想定。
動作確認は多分前にどこかでやってるやつだけど、うろ覚えで書いたりしてるから信用しないで

# 汎用

## `\n?`を含める

検索機能利用時に、通常時は単一行内のみにマッチし、
改行文字「`\n`」を含む場合に自動で複数行検索となるエディタで、
「検索文字列そのものには改行文字が意味を持つことはないけど、複数行にはマッチしてほしい」ニーズに。

検索文字列の冒頭で書けば流用するとき確認しやすいか。
末尾でもよさそう。

VSCodeで確認。
IDEAシリーズでは確認せず。

### 注意点
置換する場合は、ほんとうにその位置に改行文字があった場合に置換対象に改行文字が含まれてしまう。
キャプチャして呼び出せば解決する。

## `\s*`を各所に入れる

コーディングする人が余計なことしてなきゃいらなかったり、
逆にフォーマッタを普通に使ってれば入る「`a + b`」の演算子前後とかを
明示するのに使う。

疑わしいコードを検索するときは常時入れてるよ
(レビュ前とか、歴史の長いやつとか)
普段使いするときは、マッチするはずのものがマッチしないときだけ入れればいいと思うよ。

スペースが入りうる場所をいちいち考えなきゃいけないのでちょっとストレスを感じるよ。
でも、同じ関数の連続呼び出しとかで、縦が揃ってるのは歓迎するので、入れるなとは言わないよ。
ただまあ、縦揃ってることが前提で、揃ってないと読みにくいなら、なんか修正したほうがいいかもね。

# 各言語ごと

## Visual Basic (VB) Family

VBS とか VBA とか VB.NET とか。

### 関数定義探したい

```sh
(sub|function) NameOfFunc
```

ちょー単純ね。
VB系で `Sub`とか`Function`とかを省略できる書き方があるか知らない。あったらごめん。

あと、流石に

```vb:vb
Sub _
subname
```

は、...できたとしてもしないよね？

### コメント

行コメントしかないのでできる荒業

```scala
^\s*'.*\n
```

行頭から空白文字だけ連続してて、
最初に登場する空白文字以外が行コメントの最初につける文字列`'`で、
その後ろの文字列を改行までコメントとみなす。

行途中からのコメントを拾おうとすると、
文字列中に'が出てきたときとの区別がつけられなくて死ぬ。

### 関数単位ジャンプを検索でやる

否定の表現が必要
`(?<type>sub|function)`部分をキャプチャして、`End \k<type>`の否定行複数とかを間に挟んで、最後にこれにマッチする行を入れる。
ちょっと覚えきれてないのでいつか追記するかもしれないし、しないかもしれない。

正規表現側のオプションで複数行にマッチするやつがあったと思うので、このオプションを有効にすれば、
否定行複数なんざいれんでも、`.+?^[  \t]*End[  \t]*\k<type>[ 　\t]?[^\n]*?$`とかでもいいかもしらんが。

## markdown

### 見出しの階層を深くする

`#`の見出しを、あとから「あっ階層さげてえ」ってなったときに使う。

```
FIND:
^(#+)( .+?)$

REPLACE:
$1#$2
```

`$2`部分が見出しのテキスト
上はQiita仕様にあわせたやつ。他だとどうだかわかんにゃいので、適宜変えて。

### 逆に浅くする

```
FIND:
^(#+)#( .+?)$

REPLACE:
$1$2
```

### ソースファイル指定するところ

```` ```lang ````のlangの部分を書き換えたいときに使う。
(このページの整備するときに言語指定を一括変換したくて。)

````sh
FIND:
```(.+?)(:|$)
REPLACE:
```NewLang$2
````

`$1`(`(.+?)`)部分に言語名が入るよ
特定の言語だけ変えたいならそこを書き換えてね。

## html

### 特定のタグを検索

#### 開始タグ


```sh:summaryの開始
<\s*(summary)
```

```sh:タグ名を名前付きキャプチャ
<\s*(?<tagName>\w+)
```

#### 終了タグ

```sh:summaryの終了
<\s*/\s*(summary)
```

```sh:タグ名を名前付きキャプチャ
<\s*/\s*(?<tagName>\w+)
```

#### 開始 or 終了

```sh:summary
<\s*/?\s*(summary)
```

```sh:タグ名を名前付きキャプチャ
<\s*/?\s*(?<tagName>\w+)
```

#### 空要素

```sh:
<\s*(?<tagName>\w+)[^>]* />
```

## SQL

### 各種ソース上のSQL文から FROM 句を探し当てる

```r
\bfrom\b(.|\n)*?\bTABLE_\w+
```

`TABLE_`は、テーブル名につけているプレフィクスなど。
開発規約に依存。どうしようもなければ`\w+`とか`\w+_\w+`とか


# 空白文字操作

## インデントのスペースの数の変更

```sh
FIND:
^(?<space> +)\k<space>

REPLACE:
$1
```

行頭から始まる空白文字の個数を半分にする
(小数点以下切り上げ)

明示的に4を2にするなら↓

```sh
FIND:
^(?<space> +)\k<space>\k<space>\k<space>

REPLACE:
$1$1
```

ほんとはこんなのは、VSCodeのスペース数設定を変えて再フォーマットすればすむ話よ。


# サクラエディタ拡張

## WindowsのTREEコマンドの出力をアウトライン解析

多分もっといい書き方ある。
あと、相対パスで4か5階層以上深いと同じ階層として出る。



### ASCII 文字オプション オフ

```sh:sakuraTree.outline
;Mode=RegexReplace
;CommentChar=
^[├└]─(.*) /// $1 /// subfolder,Lv=1
^(\│  ){1}[├└]─(.*) /// $2 /// subsubfolder,Lv=2
^(\│  ){2}[├└]─(.*) /// $2 /// subsubsubfolder,Lv=3
^(\│  ){3}[├└]─(.*) /// $2 /// subsubsubsubfolder,Lv=4
^(\│  ){4,}([├└])─(.*) /// $2$3 /// subsubsubsub'sChildrenfolder,Lv=5
```

これ多分間違ってる気がする。

```sh
^([\│ ]  ){n}[├└]─(.*)
```

じゃね？

### ASCII 文字オプション オン

```sh:sakuraTreeASCII.outline
;Mode=RegexReplace
;CommentChar=
^[+\\]---(.*) /// $1 /// subfolder,Lv=1
^([| ]   ){1}[+\\]---(.*) /// $2 /// subsubfolder,Lv=2
^([| ]   ){2}[+\\]---(.*) /// $2 /// subsubsubfolder,Lv=3
^([| ]   ){3}[+\\]---(.*) /// $2 /// subsubsubsubfolder,Lv=4
^([| ]   ){4,}([+\\])---(.*) /// $2$3 /// subsubsubsub'sChildrenfolder,Lv=5
```


# シチュエーション毎

## ASP・JSP・PHP の`<%スクリプトレット%>`の外

サーバーサイドコードがこの中に紛れてたらヤバイって範囲をハイライトするのに使う。

```php
%>(.*?\n?)*?<%
```