おはようございます。今回は筆者が正規表現を学んでみて、つい忘れがちなところをまとめてみました。
筆者の学習用ノートを見るような感じでこの記事を読んでいただけるとよいです。完全に主観で書いたので、正規表現について基礎から知りたい方はこちらの記事を読んでください。
正規表現を用いるコマンド
grepコマンド
使い方:grep [オプション] 正規表現 [ファイル名]
正規表現による検索を行います。検索の対象範囲は指定したファイルになります。
オプションですが複数あります。ここでは一部を紹介します。
- -E:BREではなくてEREを使用する
- -i:大文字と小文字の区別をつけないで検索する
- -n:行番号を表示する
- -o:マッチした部分ごとに改行区切りで表示する
- -e:マイナスから始まる正規表現を利用できる
ファイルを指定しない場合は標準入力を検索します。
sedコマンド
使い方:sed [オプション] コマンド [ファイル]
正規表現による置換を行います。ファイルを指定したときはファイル内の置換、ファイルを指定しない場合は標準入力の置換をします。
オプションはgrepコマンドと同様です。
sedコマンドはデフォルトで各行をプリントしますが、-n
でオプションを指定し、プリントを抑制できます。
コマンド部分には、s/(正規表現)/(置換文字列)/g
を入れます。
wcコマンド(おまけ)
使い方:wc [オプション] [ファイル]
オプションの例:-l
, -m
wc -l ファイル名
でファイルの行数を表示できます。wc -m ファイル名
はファイルの文字数を表示します。
重要!
wcコマンドは末尾が改行で終わっていない行を行数に含めていません。
Unix系はファイルは改行で終わるものと考えています。よって、wcコマンド-lオプションで表示される行数は改行文字の個数と一致します。
肯定先読みと否定先読み
次は慣れるまで大変な正規表現の方法です。
肯定先読み(Positive Lookahead)
使い方:(?=正規表現)
ある位置の後ろの文字列が正規表現にマッチするとき、その位置がマッチするところである。
文字ではなく位置にマッチする点に注意です。
否定先読み(Negative Lookahead)
使い方:(?!正規表現)
肯定先読みと同じく位置にマッチします。マッチする位置の条件は、その位置の後ろの文字列が正規表現とマッチしないことです。
肯定は?の後ろには=がきていますが、否定は?の直後は!です。!は否定を表すので覚えやすいです。
控えめなくり返し
正規表現に繰り返しがあったと思います。*
, +
, ?
はもっとも長い文字列とマッチしようとします。
しかし、控えめな繰り返しというものは、できるだけ短い文字列とマッチするようにします。
使い方は普通の繰り返しの直後に?をつけます。
*?
, +?
, ??
, {1,3}?
のように使うことで控えめな繰り返しを実装できます。
例
C言語プログラムで使われる" "
文字列リテラルを検索する正規表現を作成します。ただし、簡単にするために「”hello\”」のような文字列はないものと考えます。
正規表現をある程度学習した方は".*"
と作成するのではないでしょうか。ドットは任意の1文字、スターは0回以上の繰り返しです。
一見間違いのようには見えないですが「”hello” + “world”」にこの正規表現を適用させるとこの文字列全体”hello” + “world”にマッチしてしまいます。本来は”hello”と”world”の2つにマッチさせるはずです。
この問題を解決するために控えめな繰り返しが存在します。
".*?"
という正規表現を考えます。?がついていることから、任意の1文字が0回以上続き、マッチする文字列の最後が”で終わる文字列という意味になります。よって”から始まって”で終わる”hello”と”world”にそれぞれマッチするようになりました。
おわりに
今回は正規表現で忘れやすいところを紹介しました。
自分用に作成した記事であるため、画像やイラストがなくて見にくかったと思われます。申し訳ございません。
最後まで読んでいただきありがとうございます!正規表現の記事を他にも投稿しているので見ていただけると嬉しいです。
↓おすすめの記事
コメント