2014/05/15更新

正規表現とは

正規表現とは、文章の中から一定のパターン(条件式)に一致する文字だけを取り出したり判別する機能です。

文字列の「探せ」「取り出せ」手順と違い、抽象的な条件で調べることができます。

正規表現を使う前に

正規表現は、Perlの正規表現に準拠したものです。

正規表現に指定できるパターン

パターンには、次のような正規表現を利用することができます。
なお、プロデルでは“[”と“]”に特別な意味があるため、代わりに“[[]”および“[]]”と指定してください。

正規表現 意味
ABC ABCという文字列
[ABC] A、B、Cのいずれか1文字
[A-C] A~Cまでのいずれか1文字
[^ABC] A、B、Cのいずれでもない任意の1文字
. 任意の1文字
A+ 1文字以上のA
A* 0文字以上のA
A? 0文字または1文字のA
^A Aで始まる文字列
A$ Aで終わる文字列
ABC|DEF|GHI ABCまたはDEFまたはGHI
A{2} 2個のA(AA)
A{2,} 2個以上のA(AA、AAA、AAAA、...)
A{2,3} 2個~3個のA(AA、AAA)
[\b] バックスペース

先頭に「\」を付けると特別な意味を表します。

正規表現 意味
\b スペースなどの単語の区切り
\B \b以外の文字
\cA Ctrl-A
\d 任意の数値([0-9]と同じ)
\D 数値以外の文字([^0-9]と同じ)
\f フォームフィード文字
\n 改行文字
\r 復帰文字
\s 1文字の区切り文字([ \f\n\r\t\v])
\S \s以外の1文字
\t タブ文字
\v 垂直タブ文字
\w 英数文字([A-Za-z0-9_]と同じ)
\W \w以外の文字
\2 2番目の (...) にマッチした文字列
\o033 8進数で033にあたる文字
\x1b 16進数で1bにあたる文字
\その他 その他の文字自身

 

正規表現に一致するパターンを取り出す

文字から、パターンに一致する部分を取り出すには、「取り出し」手順を使います。

正規表現によって【文字】から【パターン】を取り出し

「区別して」を指定すると、パターンに含まれる文字の大文字・小文字を区別して検索します。

例 住所から郵便番号だけを取り出す

ーー郵便番号のみを取り出します
内容は、「〒123-4567 東○都○代田区9-99-9 山○太郎」
(正規表現によって内容から「\d{3}-\d{4}」を取り出したもの)を表示する

 

正規表現を使って判断する

正規表現の「合致」手順を使って、【文字】が一定の書式(パターン)を満たしているかどうかを判断することができます。

指定したパターンに合致する場合は、真(○)を表します。

もし[正規表現によって【文字】【パターン】に合致する]なら 

例 メールアドレスか住所かを判断する

入力された文字がメールアドレスか住所かのどちらかを判断します。

ーーxxx@xxx.xxx に当てはまる場合メールアドレスと判断します。
内容は、入力画面で「メールアドレスまたは住所を入力してください」を入力したもの
もし[正規表現によって内容が「.+@.+\.」に合致する]なら
  「メールアドレスです」を情報で表示する
でなければ
  「メールアドレスではありません」を警告で表示する
もし終わり 

子要素の指定(サブマッチ)

子要素(サブマッチ)は、パターンに該当する部分から、さらに細かく該当する部分を取り出したいときに 指定します。子要素は、パターンの中で“( )”で囲むことで指定できます。

指定した子要素を取り出すときは、「子要素ごとに取り出す」手順を使います。
この手順では、パターンに合致する部分それぞれに対して、子要素を配列で表すことができます。

また、子要素に該当する部分を同じパターン内で使うこともできます。
例えば、パターンの中で“\1”と書くと、それは1番目の子要素の内容と同じであることを表わすことができます。

例 電話番号を市外局番などに分ける

電話番号を分解して、市外局番(03)市内局番(1234)番号(5678)の順に配列に保存します。
結果は、「03,1234,5678」と表されます。

ーー電話番号を細かい分解する
電話番号配列は、正規表現によって「03-1234-5678」から「([[]0-9[]]*)-([[]0-9[]]*)-([[]0-9[]]*)」を子要素ごとに取り出したもの
電話番号配列を表示する

例 HTMLからタグ名とその内容を取り出す

HTMLから対になるタグ(<head></head>や<body></body>)を探して、タグの名前とその内容を取り出します。
対になるタグを探すために、「<(.*)>~<\/\1>」というパターンを指定しています。

内容は、「<head>ヘッダです。</head><body>本体です。</body>」

ーーHTMLから該当するタグ全体を取り出します

(正規表現によって内容から「<(.*)>.*<\/\1>」を取り出したもの)を表示する

ーーHTMLから該当するタグからタグ名と内容だけを取り出します
(正規表現によって内容から「<(.*)>(.*)<\/\1>」を子要素ごとに取り出したもの)を表示する

この例では、「子要素ごとに取り出す」手順を利用しています。
「内容」変数にあるHTMLから、「<○○>◇◇◇</○○>」の形になる部分を取り出して、
「○○」にあたる内容と「◇◇◇」にあたる内容を分解して、配列形式で表します。 

正規表現を使って置き換える

正規表現を使うことで、「置き換え」命令よりも複雑な置き換えをさせることができます。

正規表現によって【文字】【パターン】から【置換後 のパターン】へ置換したもの

「区別して」を指定すると、パターンに含まれる文字の大文字・小文字を区別して検索します。

文字の置き換え

置換前の部分には、正規表現のパターンを指定します。
置換後の部分には、文字のほかに、サブマッチで指定した文字($1など)も指定できます。

ーー数字をすべてXに置き換えます
内容は、「電話番号は、1234-567-890。郵便番号は、987-6543です。」
内容を表示する
置換後は、[正規表現によって内容を「\d」から「X」へ置換したもの]
置換後を表示する

パターン置き換えでは、次のような高度な置き換えもできます。

ーー内容から数字を探し、前後を" "で囲みます
内容は、「ABC123EDG456HIJ」
置換後は、[正規表現によって内容を「\d+」から「"$&"」へ置換したもの]
置換後を表示する

文字の置き換え

サブマッチを利用することで、文字の並び替えなどのような操作ができます。

ーーパターンを利用した単語の並び替え
内容は、「私は、『猫』と『犬』を飼っています」
内容を表示する
置換後は、[正規表現によって内容を「(『\S+』)と(『\S+』)」から「$2と$1」へ置換したもの]
置換後を表示する

最短一致

通常、正規表現では、パターンに合致する最も長い部分で取り出そうとします。
最も短い部分に合致するようにするためには、数の指定または*の直後に「?」を付けます。

次の例の場合、「にわ」が複数含まれますが、「.*」は以降の「にわ」にも合致しますので、すべて取り出され、最も長い部分が結果となります。

結果は、正規表現:「にわにはにわにわとりがいる」から「にわ.*」を取り出したもの
結果を表示する

次の例の場合は、先頭の「にわ」の後にある「にわ」がパターンにある「にわ」に合致しますので、最も短い部分で取り出され、結果は3つとなります。

結果は、正規表現:「にわにはにわにわとりがいる」から「にわ.*?」を取り出したもの
結果を表示する