目的の文字列を抜き出す方法がわからず困ったのでうまく行った正規表現の書き方をメモしておきます。
結論から言うと正規表現の先読み、後読みを利用して特定の文字列を抽出できました。
今回は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)が来る位置にマッチさせています。
データを扱う際に色々応用できそうですね!