正規表現

正規表現

文字列 検索エンジン。 文字列による検索だけでなく、メタ文字と呼ばれる制御文字を使って、不特定の文字文字の配置場所 などを指定できる。

メタ文字

正規表現として特別な意味を持つ文字

種類 概要 該当するメタ文字
文字クラス 文字にマッチする文字 ., [a-zA-A], [^a-z]
量子化 直前の文字の繰り返しを指定する文字 ?, *, + , {1,3}
位置指定子 位置にマッチする文字 ^, $
グループ化 文字をグループ化する文字 (foo|bar)
エスケープ メタ文字をエスケープする \

文字クラス

. ドット 任意の一文字にマッチする

田中.郎

以下にマッチする

田中太郎, 田中次郎, 田中三郎 

[] 特定の一文字にマッチする

田中[一二三]郎

以下にマッチする

田中一郎, 田中二郎, 田中三郎

繰り返しを指定するメタ文字

メタ文字 意味 使用例 マッチする例
* 直前の文字が 0回以上 繰り返す。 最長一致。 Windows *95* Windows 95, Windows95
+ 直前の文字が 1回以上 繰り返す。最長一致。 Windows +95 Windows 95
? 直前の文字が 0 もしくは1回 繰り返す。 最長一致。 Windows ?95 Windows95, Windows 95
*? 直前の文字が 0回以上 繰り返す。 最短一致。
+? 直前の文字が 1回以上 繰り返す。最短一致
{m, n} 直前の文字が、 m回以上、n回以下繰り返す [0-9]{3}-[0-9]{4} 123-4567

最長一致と最短一致について

例として、 直前の文字が任意の一文字を表す 「.」の場合、最長一致と最短一致とでマッチ範囲が異なる

<a href="yahoo.co.jp>Yahoo Japan</a> <a href="google.com">Google</a> <a href="twitter.com">Twitter</a>
正規表現 マッチ範囲
<a .*</a> 一行全てにマッチ
<a .*?</a> 各リンクにマッチ

位置指定

^ 行頭へのマッチ

行頭のインデントにマッチさせる

^\s+

$ 行末へのマッチ

行末にマッチさせる

$

文字位置へのマッチ1 肯定先読み (?=検索文字)

雲の前の形容詞にマッチさせる

巻雲 巻積雲 巻層雲 高積雲 高層雲 積乱雲 乱層雲 積雲層 積雲層雲
.*?(?=雲)
  • .*? 次の文字に対して最短一致
  • .* 次の文字に対して最長一致

f:id:yossan2:20200613225244p:plain

文字位置へのマッチ2 否定先読み (?!検索文字)

乗り物の飛行機にマッチさせる

飛行機雲を作りながら飛行機が飛んでいる
飛行機(?!雲)

文字位置へのマッチ3 肯定後読み (?<=検索文字)

ローソンの店名のみにマッチさせる

(?<=ローソン).+?店
  • .+? 次の文字までの最短一致
  • .+ 次の文字までの最長一致

文字位置へのマッチ4 否定後読み ?<!

姓が田中以外の太郎にマッチさせる

(?<!田中)太郎

その他のメタ文字

グループ化

  • ()
    • 正規表現をグループ化するためのメタ文字
    • 後方参照するためのメタ文字

(Wine){2,}

Wine, WineWine, WineWineWine
  • | 複数の正規表現をOR条件でつなぐメタ文字

abc|xyz

abc,xyz

(Vodka|Wine)

Vodka, Wine

参照

基本的な正規表現一覧 | murashun.jp

Rubular: a Ruby regular expression editor