LoginSignup
10
9

More than 5 years have passed since last update.

正規表現の基本用語

Last updated at Posted at 2016-05-12

メタキャラクタ

\w*といった、正規表現内で通常の文字 (a ~ z など)と組み合わせて使う特殊文字のこと。
例えば

\w 英単語を構成する文字の一つ

[1] pry(main)> 'Apple'.match(/A\w/)
=> #<MatchData "Ap">
[2] pry(main)> 'Apple'.match(/p\w/)
=> #<MatchData "pp">
[3] pry(main)> 'Apple'.match(/\wl/)
=> #<MatchData "pl">
[4] pry(main)> 'Apple'.match(/p\wl/)
=> #<MatchData "ppl">

であり、

* 一つ前の文字を0回以上繰り返す

[1] pry(main)> 'Apple'.match(/Ap*/)
=> #<MatchData "App">
[2] pry(main)> 'Apple'.match(/Aa*p/)
=> #<MatchData "Ap">
[3] pry(main)> 'Apple'.match(/p*l/)
=> #<MatchData "ppl">
[4] pry(main)> 'apple'.match(/p*/)
=> #<MatchData "">

上記[4]に注意する

である。
これらメタキャラクターを組み合わせて使用することもできる。

\w*の組み合わせである\w*は、「0個以上の文字数を持つ英単語にマッチする」正規表現である

[1] pry(main)> 'apple'.match(/\w*/)
=> #<MatchData "apple">
[2] pry(main)> 'Apple'.match(/\w*/)
=> #<MatchData "Apple">

量指定子

前述のメタキャラクタ*といった、パターンの繰り返しを示すものを量指定子と呼ぶ。
*の他に、

+ 一つ前の文字を1回以上繰り返す

[1] pry(main)> 'Apple'.match(/Ap+/)
=> #<MatchData "App">
[2] pry(main)> 'Apple'.match(/A+p/)
=> #<MatchData "Ap">
[3] pry(main)> 'Apple'.match(/Aa+p/)
=> nil

上記[3]に注意する

といったものや、

? 0回か1回の繰り返し

[1] pry(main)> 'Apple'.match(/A?p/)
=> #<MatchData "Ap">
[2] pry(main)> 'Apple'.match(/Aa?p/)
=> #<MatchData "Ap">
[3] pry(main)> 'Apple'.match(/Ap?/)
=> #<MatchData "Ap">

文字クラス

大かっこ[]の中に書かれた複数の文字のうちの、どれか一つが対象の文字列にマッチする。

[1] pry(main)> 'Apple'.match(/[abc]/)
=> nil
[2] pry(main)> 'apple'.match(/[abc]/)
=> #<MatchData "a">

[^]とすることで、指定された文字以外とマッチすることもできる。

[1] pry(main)> 'apple'.match(/[^abc]/)
=> #<MatchData "p">
[1] pry(main)> 'apple'.match(/[^p]/)
=> #<MatchData "a">

このような、いずれかが文字列に含まれると一致と見なされる文字のセットを文字クラスと呼ぶ。

エスケープ

前述したような、正規表現内でメタキャラクタとして扱われている文字を通常の文字として扱うため、それらの文字の前に\を置く。

[1] pry(main)> 'ap*le'.match(/\*/)
=> #<MatchData "*">

\の直後の文字しか通常の文字として扱わないため、正規表現\**の二つ目の*はメタキャラクタとして扱われる。

[1] pry(main)> 'ap*le'.match(/\**/)
=> #<MatchData "">

文字表現

改行、タブといった、通常の文字として表現できないものを表示する正規表現の表記法を文字表現と呼ぶ。
下記\nは改行にマッチする

[1] pry(main)> "aa\nbb\ncc\n".match(/\n/)
=> #<MatchData "\n">
[2] pry(main)> "aa\n\n\n".match(/a\n+/)
=> #<MatchData "a\n\n\n">
10
9
2

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
10
9