正規表現
概要
正規表現による検索と置換に関する機能が利用できます。正規表現とは、対象の文字から指定した法則(パターン)と同じ文字を取り出す機能です。
正規表現を利用してパターンを指定して大量の文章から指定した単語などを取り出せます。
利用する際に、このオブジェクトを作る必要はありません。
手順
【文字】が【パターン】という【自分】に、合致する
指定したパターンに合致するかどうか判定します
内容は「taro@abc.ne.jp」
内容が「「^[a-zA-Z0-9_.+-]+@([a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]*\.)+[a-zA-Z]{2,}$」」という正規表現に合致すれば
「メールアドレスです」を情報アイコンで表示する
そうでなければ
「メールアドレスではありません」を警告アイコンで表示する
そして
【内容】から【パターン】という【自分】で、取り出す:配列
指定した内容からパターンに合致する部分を取り出します
内容は「<head>header</head><body>content</body>」 ーーHTMLからタグとその内容を取り出します 内容から「「<(.*)>.*<\/\1>」」という正規表現で取り出して要素にそれぞれ繰り返す 要素を報告する そして
【内容】から【パターン】という【自分】で、区別して取り出す:配列
指定した内容からパターンに大文字・小文字を区別して合致する部分を取り出します
【内容】から【パターン】という【自分】で、子要素ごとに取り出す:2次配列
指定した内容からパターンに合致する部分を取り出します
内容は「<head>header</head><body>content</body>」
ーーHTMLからタグ名だけを取り出します
内容から「「<(.*)>.*<\/\1>」」という正規表現で子要素ごとに取り出して要素にそれぞれ繰り返す
要素を報告する
そして
※結果 {head}
※結果 {body}
【内容】から【パターン】という【自分】で、区別して子要素ごとに取り出す:2次配列
指定した内容からパターンに大文字・小文字を区別して合致する部分を取り出します
【自分】で【内容】を【探すパターン】から【置換後のパターン】へ〈区別して〉、置換する
指定した内容から探すパターンに合致する箇所を置換後のパターンに従って、すべて置き換えます
ーー数字をすべてXに置き換えます 内容は「電話番号は、1234-567-890。郵便番号は、987-6543です。」 正規表現で内容を「「\d」」から「「X」」へ置換して表示する ※結果 電話番号は、XXXX-XXX-XXX。郵便番号は、XXX-XXXXです。
【自分】で【内容】を無害化する
指定した内容から正規表現として意味がある記号にエスケープ文字を付加します。
正規表現で「「\d」」を無害化して表示する ※結果 \\d
正規表現のパターン
指定できる正規表現のパターンは次の通りです。プロデルでは文字列定数内の[ ]が式展開を表す記号です。正規表現を指定する場合は文字列定数を「「 」」で囲ってください。
パターンの書式
| 正規表現 | 意味 |
|---|---|
| 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 | 区切り文字(スペース、タブ、改行) ([ \f\n\r\t\v]と同じ) |
| \S | \s以外の1文字 ([^ \n\r\f\t] と同じ) |
| \t | タブ文字 |
| \v | 垂直タブ文字 |
| \w | 英数文字([A-Za-z0-9_]と同じ) |
| \W | \w以外の文字 |
| \2 | 2番目の (...) にマッチした文字列 |
| \o033 | 8進数で033にあたる文字 |
| \x1b | 16進数で1bにあたる文字 |
| \その他 | その他の文字自身 |
参考文献
サンプルコード
「取り出し」手順を使うことで、正規表現を使った文字列の取得ができます。
HTMLからタグを取り出す
正規表現で簡易的にHTMLのタグを取り出します。
HTMLは「<b>abc</b><i>def</i>」 正規表現によってHTMLから「「<(.*)>(.*)<\/\1>」」を取り出して、タグ一覧とする タグ一覧を要素にそれぞれ繰り返す 要素を報告する そして ※結果 <b>abc</b>
※結果 <i>def</i>
住所から郵便番号だけを取り出す
正規表現で住所から郵便番号の部分だけを取り出します。
ーー郵便番号のみを取り出します
内容は「〒123-4567 東○都○代田区9-99-9 山○太郎」
正規表現によって内容から「「\d{3}-\d{4}」」を取り出して要素にそれぞれ繰り返す
要素を報告する
そして
※結果 123-4567
サブマッチ「( )」の使い方
サブマッチは、正規表現で取り出した文字列からより細かく文字を取り出したいときに利用します。サブマッチを利用するときは「子要素ごとに取り出す」手順を使います。
パターンを「( )」で囲うことで、その部分だけをサブマッチとして配列に格納できます。サブマッチは、パターン内で利用することもでき、例えば「\1」は、1番目の「( )」の内容と同じことを表します。
サブマッチで電話番号を細かく分解する
電話番号を分解して、市外局番(03)・市内局番(1234)・番号(5678)の順に配列に保存します。結果は「03,1234,5678」と表されます。
ーー電話番号を細かく分解する 電話番号は「03-1234-5678」 正規表現によって電話番号から「「([0-9]*)-([0-9]*)-([0-9]*)」」を子要素ごとに取り出して電話番号配列とする 電話番号配列を要素にそれぞれ繰り返す 要素(1)&要素(2)&要素(3)を報告する そして ※結果 0312345678
HTMLからタグ名とその内容を取り出す
HTMLから対になるタグ(<head></head>や<body></body>)を探して、タグの名前とその内容を取り出します。
対になるタグを探すために「<(.*)>~<\/\1>」というパターンを指定しています。
内容は「<head>ヘッダです。</head><body>本体です。</body>」 正規表現によって内容から「「<(.*)>(.*)<\/\1>」」を子要素ごとに取り出して、タグ一覧とする タグ一覧を要素にそれぞれ繰り返す 「[要素(1)]=>[要素(2)]」を報告する そして ※結果 head=>ヘッダです。 ※結果 body=>本体です。
なお、タグの間に改行が含まれる場合は、マッチしません。次の「最短一致」の例をご覧ください。
関連項目 子要素ごとに取り出す
最短一致で検索する
通常、正規表現では、パターンに合致する最も長い部分で取り出そうとします。最も短い部分に合致するようにするためには、数の指定または*の直後に「?」を付けます。
次の例の場合「にわ」が複数含まれますが「.*」は以降の「にわ」にも合致しますので、すべて取り出され、最も長い部分が結果となります。
正規表現によって「にわにはにわにわとりがいる」から「「にわ.*」」を取り出して、結果とする 結果を要素にそれぞれ繰り返す 要素を報告する そして ※結果 にわにはにわにわとりがいる
次の例の場合は、先頭の「にわ」の後にある「にわ」がパターンにある「にわ」に合致しますので、最も短い部分で取り出され、結果は3つとなります。
正規表現によって「にわにはにわにわとりがいる」から「「にわ.*?」」を取り出して、結果とする 結果を要素にそれぞれ繰り返す 要素を報告する そして ※結果 にわ ※結果 にわ ※結果 にわ
HTMLから<body>タグの内容を取り出す
内容は「「<html><body>こんにちは太郎です。 よろしくどうぞ。</body><html>」」 内容から「「<body>([\s\S]*?)<\/body>」」という正規表現で子要素ごとに取り出して、本文内容とする 本文内容を要素にそれぞれ繰り返す 要素(1)を報告する そして ※結果 こんにちは太郎です。 ※結果 よろしくどうぞ。