正規表現の利用方法



正規表現とは?

正規表現 (regular expression)とは、文字列の集合(パターン)を表す汎用的な記法です。 例えば、文字列「book または cook」のことを正規表現で [bc]ook と書くことができ、[bc] は 「b か c かどちらか 1 文字」という意味です。
そのほかに文字列「h1~h6 のいずれか」を表すには h[1-6] と書きます。
正規表現などで表される文字列パターンに合致する文字列を探すことを、 パターンマッチと言います。

以下によく使われるメタ文字とその意味を紹介します。

ある1文字を表す文字(アトム)

文字説明使用例
.
(ピリオド)
改行文字(\n)以外の任意の一文字。(ただし [] 内ではピリオド文字。)「.」
「」内に任意の1文字がある箇所にマッチ
\s空白文字。改行文字、タブ文字、半角/全角スペース文字など。[\f\n\r\t\v\x85\p{Z}]と同じ。
(ちなみに \S は \s 以外の文字を表す。)
PDF\sReName
PDF と ReName の間に空白文字が1文字ある箇所にマッチ
\d0から9までの数字。全角を含む。\p{Nd}と同じ。
(ちなみに \D は \d 以外の文字を表す。)
PDF\d
VB の後に数字が1文字ある箇所にマッチ
\w単語に使用される文字。アルファベット、数字、アンダーバー(_)、ひらがな、カタカナ、漢字など。[\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}]と同じ。
(ちなみに \W は \w 以外の文字を表す。)
「\w」
「」内に単語に使用される文字が1文字がある箇所にマッチ
\rキャリッジリターン。\u000Dと同じ。\r\n
Windows の改行文字(CRLF)にマッチ
\nラインフィード(改行文字)。\u000Aと同じ。\r\n
Windows の改行文字(CRLF)にマッチ
\tタブ。\u0009と同じ。\n\t
改行文字(\n)の後にタブが続く箇所にマッチ
\\文字の前に \ を付けると、その文字。メタ文字の機能を無効にするときに使う。capsulecontents\.com
capsulecontents.comにマッチ
[ ][]内のどれか1文字。[abc]ならば、aかbかc。PDF[2456]
PDFの後に2か4か5か6が続く箇所にマッチ
[^ ][^]内の文字以外の1文字。[^abc]ならば、aかbかc以外の文字。「[^「」]」
「」内に「」以外の1文字がある箇所にマッチ
[ – ]連続した文字範囲の1文字。[0-9]ならば、数字1文字。[a-zA-Z]ならば、アルファベット1文字。VB[24-6]
VB の後に 2か4か5か6 が続く箇所にマッチ
\u00004桁の16進数で表されるUnicode文字。[\uFF61-\uFF9F]
半角カナ文字の1文字にマッチ
\x002桁の16進数で表されるASCII文字。[\x20-\x7F]
半角英数記号文字(0x20~0x7F)の1文字にマッチ

文字列内の位置を表す文字(アトミックゼロ幅アサーション、アンカー、位置指定子)

ここで紹介するメタ文字は、文字列内の位置を表現したものです。文字とマッチするわけではありません。

文字説明使用例
^文字列の先頭。^\d
先頭にある数字1文字にマッチ
$文字列の末尾。\d$
末尾にある数字1文字にマッチ
\b単語の境界(\w と \W の間)と一致。(ただし [] 内ではバックスペース文字。)
(ちなみに \B は \b 以外の境界を表す。)
\bPDF\b
PDF が単語として現れる箇所にマッチ

文字の繰り返しを表す文字(量指定子)

ここで紹介する量指定子は、文字(または、グループ)の繰り返しを表現するものです。最長マッチと最短マッチの違いは非常に重要ですが、これについては後述します。

文字説明使用例
*直前の文字が0回以上繰り返す。<[^>]*>
<>で囲まれた箇所にマッチ
+直前の文字が1回以上繰り返す。<[^>]+>
<>内に1文字以上ある箇所にマッチ
?直前の文字が0回または1回繰り返す。-?\d+
マイナスが付いた数字、あるいは付かない数字にマッチ
{n,m}直前の文字がn回以上m回以下繰り返す。\d{2,6}
数字が2文字以上6文字以下続いている箇所にマッチ
{n}直前の文字がn回繰り返す。\d{6}
数字が6文字続いている箇所にマッチ
{n,}直前の文字がn回以上繰り返す。\d{8,}
数字が8文字以上続いている箇所にマッチ
*?最短マッチで、0回以上の繰り返し。<.*?>
<>で囲まれた箇所にマッチ

選択、グループ化などを表す文字

ここで紹介するグループ化を使用する主なケース

文字説明使用例
|| で区切られた文字列のいずれか(論理和)。リンゴ|りんご|林檎
リンゴ または りんご または 林檎 にマッチ
( )グループ化する箇所。山田(太郎|花子)
山田太郎 または 山田花子 にマッチ
(?<name> )グループに名前(あるいは番号)を付ける。(ちなみに、< > の代わりに ' で括ることもできる。)VB(?<ver>\d)
PDF の後に数字がある箇所にマッチし、数字を"ver"というグループ名でキャプチャ
(?: )キャプチャしないグループ。山田(?:太郎|花子)
山田太郎 または 山田花子 にマッチするが、太郎 または 花子 をキャプチャしない
(?= )直後にこのパターンが現れることを確認する(ゼロ幅の肯定的先読みアサーション)。\d+(?=%)
後ろに % が続く数字の連続にマッチ。ただし、% はマッチした箇所に含まれないし、グループとしてキャプチャもされない。
(?! )直後にこのパターンが現れないことを確認する(ゼロ幅の否定的先読みアサーション)。\d+(?!%)
後ろに % が来ない数字の連続にマッチ。
(?<= )直前にこのパターンが現れることを確認する(ゼロ幅の肯定的後読みアサーション)。(?<=\\)\d+
\ に続く数字の連続にマッチ。ただし、\ はマッチした箇所に含まれないし、グループとしてキャプチャもされない。
(?<! )直前にこのパターンが現れないことを確認する(ゼロ幅の否定的後読みアサーション)。(?<!\\)\d+
前に \ がない数字の連続にマッチ。

前方参照(後方参照)を表す文字

グループ化してキャプチャした文字列を後から参照することができます。これが前方参照(後方参照)です。これによって、キャプチャした文字列をパターンに埋め込むようなことができます。

文字説明使用例
\number番号がnumberのグループと一致した文字列。<(H\d)>.*?</\1>
<H>タグで囲まれた箇所にマッチ
\k<name>名前がnameのグループと一致した文字列。(ちなみに、< > の代わりに ' で括ることもできる。)<(?<tag>H\d)>.*?</\k<tag>>
<H>タグで囲まれた箇所にマッチ

置換パターンで使用できる特殊文字

前方参照(後方参照)と同じように置換パターン内で以下のような特殊文字を使用することができます。

文字説明
$number番号が number のグループと一致した文字列。
${name}名前が name のグループと一致した文字列。
$&パターン全体と一致した文字列。