LoginSignup
4
3

More than 3 years have passed since last update.

正規表現 アンカー

Last updated at Posted at 2019-11-24

アンカーは幅0の文字列にマッチするメタ文字列です。 幅0とは文字と文字の間、文字列の先頭、文字列の末尾、 などを意味します。 ある特定の条件を満たす「位置」にマッチします。

^ 行頭にマッチします。行頭とは、文字列の先頭もしくは改行の次を 意味します。
$ 行末にマッチします。 行末とは文字列の末尾もしくは改行の手前を意味します。
\A 文字列の先頭にマッチします。
\Z 文字列の末尾にマッチします。 ただし文字列の最後の文字が改行ならばそれの手前にマッチします。
\z 文字列の末尾にマッチします。
\b 単語境界にマッチします。 単語を成す文字と単語を成さない文字の間にマッチします。 文字列の先頭の文字が単語成す文字であれば、文字列の先頭 の位置にマッチします。
\B 非単語境界にマッチします。 \bでマッチしない位置にマッチします。
# 文字列中の real にマッチする
/real/.match("surrealist") # => #< MatchData "real">
# 先頭に real とないとマッチしない
/\Areal/.match("surrealist") # => nil
# 単語境界がrealの前にないのでマッチしない
/\breal/.match("surrealist") # => nil
単語を成す文字、成さない文字の定義はエンコードによって 異なります。以下の例で「全角」括弧は EUC-JP では 単語を成す文字と見なされますが、UTF-8 では見なされません。 その結果、以下のような挙動をします。

# -- coding:utf-8 --
# デフォルトは UTF-8
/foo\b/.match("あいうfoo%") # => #< MatchData "foo">
/\bfoo\b/.match("あいうfoo%") # => nil
/\bfoo\b/e.match("(foo)".encode("EUC-JP")) # => nil
/\bfoo\b/.match("(foo)") # => #< MatchData "foo">
Unicode の規格では、単語を成す文字を Word というプロパティで 定義しています。

先読み、後読み(lookahead, lookbehind)
ある位置から続く文字列が ある部分式にマッチするならばその位置にマッチする という正規表現を書くことができます。

「ある位置から続く文字列(先読み、lookahead)/ある位置の手前までの文字列(後読み、lookbehind)」 と「マッチする(肯定、positive)/マッチしない(否定、negative)」 の組み合わせで4つのパターンがあります。

(?=pat) 肯定先読み(positive lookahead)
(?!pat) 否定先読み(negative lookahead)
(?<=pat) 肯定後読み(positive lookbehind)
(?<!pat) 否定後読み(negative lookbehind)
\K 後読みの別表記、このメタ文字列の手前までを後読みします。 つまり /pat1\Kpat2/ は /(?<=pat1)pat2/ と同様の意味となります。
# 以下の例では、後読みと先読みを使って < b> と
# に挟まれているという条件を正規表現中に記述しつつ
# 自体にはマッチさせていない。
/(?<=< b>)\w+(?=<\/b>)/.match("Fortune favours the < b>bold< /b>")
# => #< MatchData "bold">
# 以下は上の正規表現と同じものを表す
/< b>\K\w+(?=<\/b>)/.match("Fortune favours the < b>bold< /b>")
# => #< MatchData "bold">

4
3
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
4
3