正規表現とは
正規表現とは、文章の中から一定のパターン(条件式)に一致する文字だけを取り出したり判別する機能です。
文字列の「探せ」「取り出せ」手順と違い、抽象的な条件で調べることができます。
正規表現を使う前に
正規表現は、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つとなります。
結果は、正規表現:「にわにはにわにわとりがいる」から「にわ.*?」を取り出したもの
結果を表示する