どうも、シノだ。
さっきはJavaScriptを書いていたが、今度は正規表現を書いていく。
今回は正規表現講座第1回、任意の文字をパターンで表していく。また、同時に使うことの多そうな繰り返しについても見ていこうと思う。
他にも、正規表現を実際にどう使うかの別の方法も紹介しよう。
前回の復習
前回は、そもそも正規表現とは何なのかと、その使い方、また複数の候補いずれかに一致する場合を解説した。
正規表現は、文字列がパターンに合致するかどうかを調べるものだと思っておいてくれればいいだろう。組み合わせることで、大体のパターンは書けるようになる。
また、Windowsで実際に動かす方法も紹介した。今回以降も、この場合で解説していく。
任意の文字を表す
早速今回の内容だ。
任意の文字を表すものを紹介しよう。これは非常に簡単で、ドット一つを書くと、任意の1文字を表してくれる。
具体例で見ていこう。例えば、abcとdefという文字列の間に、なんでもいいから1文字入っているパターンを探したいとする。
そのとき、以下のような正規表現になる。
abc.def
これで、幾つかの文字列でパターンに合致するか確認してみよう。
echo 'abcdef' | Select-String -Pattern 'abc.def'
echo 'abcdefg' | Select-String -Pattern 'abc.def'
echo 'abchdefg' | Select-String -Pattern 'abc.def'
出力結果
(出力なし)
(出力なし)
abchdefg
このように、abc(何か一文字)defといった文字列を探すことができる。
これを応用すると、例えば辞書データが書かれているテキストから、「aから始まってsで終わる5文字の文字列が入った単語」というような探し方ができるようになる。ちなみに、このパターンはa...s
となる。
繰り返し
さて、文字数が分かっていればまだやりやすい。
しかし、その文字数が分からない場合もある。
そこで、その文字数を何文字でもいいから探す、というようなパターンも用意されている。
0文字以上、つまり入っていなくてもいい場合は*
を、1文字以上入っていることを見たい場合は+
を使う。
こっちも例を出そう。
例えば、abcの直後にdが0回以上来るパターンを探したい場合は、以下のようになる。
abcd*
このように、*
は直前の文字が0回以上続くことを表す。これに合致するのは、「abc」、「abcd」、「abcdd」、…といったものが入った文字列だ。
それに対し、以下のようにしてみよう。
abcd+
こうすると、ほぼ上のabcd*
と同じになるが、「abc」で直後にdが来ないものは条件に合致しなくなる。
では、これを確認…する前に、そろそろいちいちコマンドを書くのが面倒になってきた。
なので、ファイルに探す対象の文字列を全部書いておいて、コマンドで読み込むように変えていこう。
ファイルから探す
まず、どのディレクトリでもいいので「Sample.txt」というテキストファイルを作ってほしい。
その中に、以下の内容をコピペしよう。
abc
abcd
abcdd
abcddd
abce
保存できたら、そのディレクトリで、「Shift」キーを押しながら右クリックしてほしい。
すると、出てくるメニューに一つ項目が増えている。「Power Shell ウィンドウをここで開く」というものだ。これを選択すると、その場所でPower Shellが開く。
Power Shellでもディレクトリは機能しており、ファイルを読み込む場合はそのパスを書かなければいけない。
それが面倒なので、だったらそこで開いてしまおうというだけだ。
で、コマンドは以下のように変える。
Select-String -Pattern '正規表現' ファイル名
こうすることで、ファイルの中身を1行ずつ正規表現と合致するか確認できる。
では、上のSample.txtで、2つのパターンを探してみよう。
Select-String -Pattern 'abcd*' .\Sample.txt
出力結果
Sample.txt:1:abc
Sample.txt:2:abcd
Sample.txt:3:abcdd
Sample.txt:4:abcddd
Sample.txt:5:abce
Select-String -Pattern 'abcd+' .\Sample.txt
出力結果
Sample.txt:2:abcd
Sample.txt:3:abcdd
Sample.txt:4:abcddd
どうだろうか。正しく読み込めていれば、上のような結果になったと思う。
ちなみに、ファイル名先頭についている「.\
」だが、これは今いるディレクトリを表している。なくても問題ない。
別のディレクトリを指したい場合は、このファイル名のところに相対、あるいは絶対パスを書こう。
組み合わせてみる
さて、任意の1文字を表すドットと、繰り返しを表す*
、+
を組み合わせてみよう。
ちょっと実践的な内容にしたいので、HTMLタグのようなものをファイルに並べてみよう。
<html>
<head>
<title>
てすと
</title>
</head>
<body>
<h1>
たいとる
</h1>
<p>
だんらく<>
</p>
</body>
</html>
こんな感じだ。さっきのSample.txtに上書きしてしまおう。
で、今度は以下のパターンで、HTMLタグを抜き出してみようと思う。
<.*>
さて、ここで問題だ。
このパターンで、上のサンプルからHTMLタグを抜き出すことができるだろうか。
答えは、ノーだ。
実行してもらうとわかると思うが、pタグ内の「だんらく<>」というやつも持ってきてしまう。
これは、<と>の間に0文字以上の文字が入っている行を持ってきてしまう。
なので、これを1文字以上にしたい。すると、一例としては以下のようになる。もちろん、他にも方法はある。
<.+>
こうすれば、今度は何でもいいから1文字以上間に入っているものを持ってこれるようになる。
さあ、実行してみよう。
Select-String -Pattern '<.+>' Sample.txt
実行結果
Sample.txt:1:<html>
Sample.txt:2:<head>
Sample.txt:3:<title>
Sample.txt:5:</title>
Sample.txt:6:</head>
Sample.txt:7:<body>
Sample.txt:8:<h1>
Sample.txt:10:</h1>
Sample.txt:11:<p>
Sample.txt:13:</p>
Sample.txt:14:</body>
Sample.txt:15:</html>
これで、HTMLタグのみが抜き出せた。
まとめ
いかがだっただろうか。
今回は、任意の1文字を表すドットと、0回以上の繰り返しの*
、1回以上の繰り返しの+
を解説した。
また、ファイルから読み込めるようになったので、一気に大量の文字列から探すこともできるようになった。
そろそろ、使えるレベルになってきたと思う。
次回は…ちょっとどう進もうかまだ考え中だ。2つで迷っている。
まあ、私の更新を待つ必要もない。気になる方はどんどん調べて欲しい。
更新情報はTwitterでも垂れ流している。よかったら、ページ下部のTwitterアイコンから覗いていってほしい。
それでは。
コメント
[…] だいぶ間が空いてしまったが、前回は任意の文字列と、繰り返しを見てきた。 […]