1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

文字列から特定の文字列だけ抜き出したい時の正規表現はどう書いたらいいの?

Last updated at Posted at 2024-03-10

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

データを扱う際に色々応用できそうですね!

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?