例6:郵便番号(行頭・行末) ~先頭「^」、末尾「$」~
例6では、位置を表すメタキャラクタについて説明していきます。
「06_郵便番号(行頭・行末).rep」を開き、[Match Text]をクリックしてください。
実は、例5のパターン文字列「\d{3}-\d{4}
」では、1234-56789でも234-5678がマッチしてしまいます。そこで、ここでは郵便番号が完全に一致したときだけマッチするように変更します。そのためには、数字を3回繰り返す前に先頭があり、ハイフンの後、数字を4回繰り返した後で末尾があるという定義をします。
位置をあらわす「^」「$」
位置を表すメタキャラクタとして、先頭には「^」を、末尾には「$
」を指定できるため、「^\d{3}-\d{4}$
」という定義に変更します。
これによって、1234-56789ではマッチしなくなり、完全な999-9999という形式にのみマッチするようになりました。位置に関する記号を次にまとめます。
記号 | 説明 | 備考 |
^ | 文字列の先頭で一致 | Multilineオプション時は行頭 |
\A |
文字列の先頭で一致 | |
$ |
文字列の末尾で一致 | Multilineオプション時は行末 |
\Z |
文字列の末尾で一致 |
詳細についてはこちらのページで確認するようにしてください。
なお、例5で説明したように、^というメタキャラクタは、範囲を表す[ ]
の中では、(先頭ではなく)否定の意味になりますので注意してください。
例7:電話番号を置換 ~置換~
例7では、電話番号を用いて、正規表現による置換の例を説明していきます。
引き続き、「07_電話番号を置換.rep」を開いて、[Match Text]ボタンの隣にある[Replace Text]ボタンをクリックしてください。ここでは、電話番号の区切り文字をハイフン「-
」から括弧「( )
」へ置換しています。
置換をするには、抽出する文字列のグループ化と、置換後のパターンを指定します。
抽出する文字列のグループ化
抽出する文字列をグループ化をするには括弧で囲みます。
ここでは「(0\d{1,4})-(\d{1,4})-(\d{4})
」というパターンで、市外局番(0から始まる2桁~5桁の数字)、地域(1桁~4桁の数字)、番号(4桁の数字)の3つのグループを抽出します。
置換パターンの指定「$n」
さらに、置換のパターンを[ReplacementString]タブのテキストボックスに記述します。$n
は置換のパターンを指定するときにだけ利用できるメタキャラクタです。ここでは、「$1($2)$3
」と記述することによって、抽出された順に$1
、$2
、$3
に代入されます。つまり、この例では、$1
に市外局番、$2
に地域、$3
に番号が代入されます。なお置換パターンでは、(
や)
のようなメタキャラクタは普通の文字として扱われます。
もし、予想したとおりに置換されない場合には、結果にカーソルをあてて、グループの内訳をポップアップ表示させると良いでしょう。
例8:電話番号を置換(名前付き) ~グループ名の利用~
例8では、例7と同様に電話番号のハイフンを括弧へ置換してみます。
「08_電話番号を置換(名前付き).rep」を開き、[Replace Text]をクリックしてください。置換の方法は例7と同じですが、ここではグループ名を使っています。
抽出する文字列にグループ名をつける「(?<name> )」
置換やプログラムでの抽出をしやすいようにグループに名前をつけることができます。グループに名前をつけるには、(?<名前> )
という形式で指定します。ここでは、「(?<市外>0\d{1,4})-(?<地域>\d{1,4})-(?<番号>\d{4})
」というパターンによって、「市外」「地域」「番号」といったグループ名をつけています。
置換パターンの指定「${name}」
グループ名を指定することで、置換する文字列を「$1($2)$3
」というような番号ではなく、「${市外}(${地域})${番号}
」というような名前で指定できるようになります。
グループ化、および、置換に関する記号について次にまとめます。
記号 | 説明 | 備考 |
( ) |
グループ化 | 1から始まる番号でキャプチャされる。0番目は正規表現パターン全体のテキスト |
(?<name> ) |
名前をつけてグループ化 | (?'name' ) のように一重引用符を利用することも可能 |
(?: ) |
グループ化(キャプチャしない) |
記号 | 説明 |
$n |
グループ番号nと一致した文字列に置換 |
${ name } |
(?<name> ) グループと一致した文字列に置換 |
グループ化に関する記号の詳細はこちらから、置換に関する記号の詳細はこちらのページで確認すると良いでしょう。
例9:メールアドレスを分割 ~分割~
例9では、正規表現を用いた文字列の分割について紹介します。
「09_メールアドレスを分割.rep」を開き、[Match Text]ボタンの隣にある[Split Text]ボタンをクリックします。
正規表現による分割「Split」
正規表現の分割(Split)命令は、String
のSplit
メソッドのように文字列を特定の文字で区切って配列に格納することができます。ただし、String.Split
が特定の文字で文字列を分割するのに対して、Regex.Split
では正規表現によって文字列を分割する違いがあります。
ここでは、カンマ、スペース、セミコロンをセパレータとして、メールアドレスを分割しています。パターン文字列に「,|\s|;
」が設定されていることを確認してください。