目的の文字列を抜き出す方法がわからず困ったのでうまく行った正規表現の書き方をメモしておきます。
結論から言うと正規表現の先読み、後読みを利用して特定の文字列を抽出できました。
今回はRubyで試しています!
先読み、後読みとは
-
(?=ex): 先読み。次にexがくる位置にマッチする -
(?<=ex): 後読み。前にexがくる位置にマッチする -
(?!ex): 否定先読み。次にexがこない位置にマッチする -
(?<!ex): 否定後読み。前にexがこない位置にマッチする
文字列と文字列の間から文字列を抜き出してみるパターン
catに格納されたCat:tama_mikeという文字列から'tama'だけを抜き出してみます。
> cat = "Cat:tama_mike"
> cat.match('(?<=\:).*(?=_)')
=> #<MatchData "tama">
-
(?<=\:):後読みを利用して、コロン(:)が前にくる位置を指定。コロンは記号なのでバックスラッシュでエスケープし、\:と書きます。 -
.*:任意の1文字(.)を0回以上繰り返す(*)という意味。 -
(?=_):先読みを利用して、次に_が来る位置にマッチさせています。
これでtamaだけが抜き出せました!
文字列と改行の間の文字列を抜き出してみるパターン
以下のようにJSON形式で整えられたデータを用意しました。
> require "json"
> hash = {"key" => { "name" => "tama", "color" => "yellow" }}
> json_str = JSON.pretty_generate(hash)
> puts json_str
{
"key": {
"name": "tama",
"color": "yellow"
}
}
=> nil
今回はこの改行コードが入ったデータから"yellow"だけ抽出してみます。
> json_str.match('(?<="color": ).*(?=\n)')
=> #<MatchData "\"yellow\"">
-
(?<="color": ):後読みを利用して、"color":が前にくる位置を指定。 -
.*:任意の1文字(.)を0回以上繰り返す(*)という意味。 -
(?=\n):先読みを利用して、次に改行コード(\n)が来る位置にマッチさせています。
データを扱う際に色々応用できそうですね!