(※見やすくするため半角スペースを置いているところがあります。)
正規表現を次のように呼んだり、記述したりしています。私だけでしょうか(だいたひかる風)
- RegEx
- reg
- パターンマッチ
など。
最低限の知識でも強力に働いてくれます。コスパがいいです。
素人プログラマーなんで許してください!素人でも結構自動化、効率化できますよ。昔の会社では自分だけラクしてました。提案しましたが昭和感満載の会社で「即、却下!」されました。せめて自分の作業だけでも…と。
文字表現
文字セットを覚えてしまいましょう!(やっつけましょう。)
数字
文字 | 意味 | 備考 |
---|---|---|
\d | 数字0から9のいずれか1文字のこと | \d \d \d なら3桁の数字のこと |
\D | \dの反転「数字じゃない」1文字のこと | [ ^\d ]とも書けるが遠回りする必要ない。 「 \D は \D です笑!」 |
英数字(とアンダーバー)
文字 | 意味 | 備考 |
---|---|---|
\w | 「大文字小文字英数字アンダーバー」の いずれか1文字のこと | \w \w \w なら3文字の文字列のこと。 文字候補の可能性がありありです。 |
\W | \w の反転 → [ ^\w ] | これも「 \W は \W です笑!」 |
ホワイトスペース!?
文字 | 意味 | 備考 |
---|---|---|
\s | ホワイトスペース文字1文字のこと スペース、タブ、改ページ、改行を含む | 見えない文字のこと? |
\S | ホワイトスペース以外の文字1文字のこと | 目に見える文字ほとんどが \S だね? |
改行とかタブとか
文字 | 意味 |
---|---|
\n | 改行文字1文字のこと ラインフィードっていうらしい |
\r | ざっくり言うと改行文字1文字のこと キャリッジリターンっていうらしい |
\t | タブ1文字のこと |
すべての文字1個のこと
「 . 」ドット。
とにかくなんでもいいので、1文字を表現します。
すべての説明にくっつけている「1文字のこと」が結構重要です。
先頭と行末
(ほんとは先頭後尾?行頭行末?)
先頭 | 行末 |
---|---|
あいうえお | あいうえお |
^ . | . $ |
「あ」がマッチします | 「お」がマッチします |
グループパターン
正規表現 | 表現する文字 |
---|---|
x y z | 「x y z」という3文字列 |
[ x y z ] | x か y か z のどれかひと文字 |
x | y | z | x か y か z のどれかひと文字 |
[ ^ x y z ] | x y z 以外の何かひと文字 |
[ a – z ] | a から z までの何かひと文字 |
ここ結構、混乱します。ポイントはとにかく [ ] はひと文字を表現しているということですかね。
文字(表現)の繰り返し
「ねぇ、直前の文字どうする?」
表現 | 意味 |
---|---|
. ? | 直前の文字があってもいいし、なくてもいい。 |
. * | 直前の文字があってもいいし、なくてもいいし、さらにたくさんあってもいい。 |
. + | 直前の文字が必ずあること。だけど、ひとつでも、たくさんあってもどっちでもいい。 |
「直前の…」という言い回しが個人的に毎回考えてしまいます。
こんな表作ってみました。
0個 | 1個 | 2個以上 | |
---|---|---|---|
? | ○ | ○ | ー |
* | ○ | ○ | ○ |
+ | ー | ○ | ○ |
- 「 ? 」はtrue?false?みたいなことを想起できるのでわかりやすいです。
- 「 * 」はWindowsではワイルドカードとして使うので「0個, 1個, 2個以上全部」と連想できるようになればいいでしょう。
- 「 + 」は残り物で消去法です。「 * と違って 0個はダメだけど、それ以外はOK」とします。
回数(量)指定
具体的に繰り返し回数を指示
表現 | 意味 |
---|---|
. { n } | 文字を n 回繰り返す |
. { n ,} | 文字を n 回以上繰り返す。最低 n 回ということです。 |
. { n , m } | 文字を n 回以上、m 回以下繰り返す。 最低 n 回、多くて m 回ということです。 |
「0か1か2以上」というのは最近どっかで見ましたね?Rubyの引数表でしょうか?関連させて覚えれば知識の定着が早い気がします。
【Rubyの引数表】について
欲張りマッチ? or NOT欲張りマッチ?
最短マッチ
「正規表現まとめver2(正規表現覚えるべきこと) | OKE2GOU」の「最短マッチ」について。
【Rubyコード】
str = "ワイルドカード"
puts str.slice(/ワ.*ド/)
puts str.slice(/ワ.*?ド/) #「?」を付けると最初のマッチで終了します。
atr = "ワイルドカードマイルド"
puts atr.slice(/ワ.*ド/) #最後まで取りにいきます「ワ~~~~~~~ド」
btr = "ワイルドカードマイルド"
puts atr.slice(/ワ.*?ド/)
=begin
ワイルドで止まります。
同じ「ワ~~~~~~~ド」でも最初の「ワ~ド」で止まります。
=end
これが「最短マッチ」です。少しずつ慣れていきましょう。
私も実際コードを書くときは考えながらすごくゆっくりです。ブツクサ言いながら笑。呪文のように。
最短マッチをうまく作れるようになるとプログラミングがもっと楽しくなります!