例3:拡張子がtxtのファイル ~繰り返し「*」「+」「?」~
例3では、ファイルの拡張子が「txt」になっているかをチェックしてみましょう。
「03_拡張子がtxtのファイル.rep」を開いてください。パターン文字列が「*\.txt
」となっていることを確認し、[Match Text]をクリックします。すると、次のエラーメッセージが表示されます。
![例3-1 例3-1](http://cz-cdn.shoeisha.jp/static/images/article/415/03-1.gif)
このエラーメッセージは、「*
」という量指定子の前に文字がないためエラーになっています。量指定子とは、文字の繰り返しを表すメタキャラクタです。繰り返しを表す記号であるために、どの文字を繰り返すかを「*
」の前につける必要があります。ここでは、拡張子がtxtであればファイル名にはこだわらないため、任意の1文字をあらわすピリオド「.
」を「*
」の前に記述し、「.*\.txt
」とします。
![例3-2 例3-2](http://cz-cdn.shoeisha.jp/static/images/article/415/03-2.gif)
この変更で、エラーメッセージは出なくなりました。しかし、「*
」は0回以上の繰り返しを意味する量指定子のため、拡張子だけの「.txt」というファイル名にもマッチしてしまっています。そこで、「*
」ではなく、1回以上の繰り返しを表す「+
」という量指定子を利用するように変更します。
![例3-3 例3-3](http://cz-cdn.shoeisha.jp/static/images/article/415/03-3.gif)
このように、「.+\.txt
」というパターンによって、拡張子がtxtのファイルをマッチングすることができます。正規表現の量指定子は、ワイルドカードのように単体では動作せず、直前の文字を繰り返すことに注意しておくと良いでしょう。
次に、繰り返しに関する量指定子についてまとめておきます。
記号 | 説明 | 備考 |
* |
ゼロ回以上の繰り返し | {0,} と同義 |
+ |
1回以上の繰り返し | {1,} と同義 |
? |
ゼロ回または1回 | {0,1} と同義 |
量指定子についての詳細は、こちらのページを参考にすると良いでしょう。
例4:拡張子がtxtかjpgのファイル ~グループ化 ( )、代替「|」~
例4では、拡張子がtxtか、またはjpgのファイルにマッチするように設定します。
「04_拡張子がtxtかjpgのファイル.rep」を開き、[Match Text]をクリックします。
![例4-1 例4-1](http://cz-cdn.shoeisha.jp/static/images/article/415/04-1.gif)
グループ化
正規表現では、( )
によってグループ化をすることができます。ここでは、( )
によって「txt」という文字列をひとかたまりとして扱うようにします。
記号 | 説明 | 備考 |
( ) |
グループ化 | 代替、抽出、置換などで利用できる |
グループ化に関する記号についての詳細は、こちらのページを参考にすると良いでしょう。
代替(または)
正規表現では、「 |
」というメタキャラクタを使って、代替を表すことができます。例えば、「(cat|dog|fish)
」と書けばcatかdogかfishという文字があればマッチさせることができます。なお、代替に関する記号に関する詳細は、こちらのページを参考にすると良いでしょう。
記号 | 説明 | 備考 |
| |
または | 縦棒で区切られた単語のいずれかと一致 |
ここでは、txtとjpgという拡張子の場合にマッチさせたいので、「.+\.(txt|jpg)
」というパターンに変更します。[Match Text]をクリックすると、txtとjpgの両方でマッチしていることが分かります。
![例4-2 例4-2](http://cz-cdn.shoeisha.jp/static/images/article/415/04-2.gif)
オプションの指定
なお、RegexDesigner.NETでは、正規表現の照合の動作を変更するオプションを設定することが可能です。例えば、大文字小文字を区別しない場合には、RegExメニューのIgnoreCase
オプションにチェックを入れます。この状態で[Match Text]をクリックすると、JPGやTxtといった拡張子もマッチするようになります。
![例4-3 例4-3](http://cz-cdn.shoeisha.jp/static/images/article/415/04-3.gif)
.NETの正規表現のオプションで指定できるのは次の表の通りです。
記号 | 説明 | 備考 |
Singleline | 単一行モードを指定 | ピリオドの意味を変更(\n を含む) |
Compiled | アセンブリにコンパイルするように指定 | |
ECMAScript | ECMAScript互換の動作が有効になるように指定 | IgnoreCaseとMultilineのみ組み合わせ可能 |
ExplicitCapture | (?<name> ) の形式で明示的に名前付けまたは番号付けしたグループだけを有効なキャプチャにするように指定する |
(?: ) の指定が不要に |
IgnoreCase | 大文字小文字を区別しない | |
IgnorePatternWhitespace | # コメントを有効 |
|
Multiline | 複数行モードを指定する | ^および$ の意味を変更し文字列の先頭および末尾ではなく、それぞれ、行の先頭および末尾と一致 |
RightToLeft | 左から右ではなく、右から左に検索 | |
None | オプションを設定しない |
オプションの詳細についてはこちらのページを参考にしてください。
例5:郵便番号 ~数字「\d」、範囲 [ ]、繰り返し { }~
例5では、郵便番号を題材にして、より高度なマッチングについて説明していきます。
「05_郵便番号.rep」を開き、[Match Text]をクリックします。ここでは、郵便番号が999-9999形式になっているかをチェックしています。
![例5-1 例5-1](http://cz-cdn.shoeisha.jp/static/images/article/415/05-1.gif)
特別な文字群をあらわす記号「\~」
パターンの「\d{3}-\d{4}
」のうち、\d
は数字を表します。「\
」という記号は、例2で紹介したようにメタキャラクタのエスケープの意味がありますが、特定の文字と組み合わせると特別な文字群を表すことができます。
数字(\d
)の他にも、単語(\w
)、スペース(\s
)といった文字群を表すことができ、\D
のように大文字で書くと数字以外という否定の意味にすることができます。
記号 | 説明 | 備考(例) |
. |
任意の1文字(\n 以外) |
Singlelineオプション時は\n も含む |
\w |
単語に使用される文字と一致 | [a-zA-Z_0-9] と同義(ECMAScript互換時) |
\W |
単語に使用される文字以外と一致 | [^a-zA-Z_0-9] と同義(ECMAScript互換時) |
\s |
スペースと一致 | [\f\n\r\t\v] と同義(ECMAScript互換時) |
\S |
スペース以外と一致 | [^\f\n\r\t\v] と同義(ECMAScript互換時) |
\d |
数字と一致 | [0-9] と同義(ECMAScript互換時) |
\D |
数字以外と一致 | [^0-9] と同義(ECMAScript互換時) |
\p{ 名前 } |
Unicodeの名前付きブロックの文字に一致 | \p{IsHiragana} →ひらがな\p{IsKatakana} →カタカナ |
\P{ 名前 } |
Unicodeの名前付きブロック以外の文字に一致 | \P{IsHiragana} →ひらがな以外\P{IsCJKUnifiedIdeographs} →漢字以外 |
また、\p
を使用すると、ひらがな/カタカナ/漢字の文字群をチェックできます。例えば、\p{IsHiragana}
と指定すればひらがなを表し、\P{IsKatakana}
と指定すればカタカナ以外を表すことができます。
その他、文字に関する記号の詳細は、こちらのページを参考にすると良いでしょう。
範囲指定の括弧 [ ]
なお、数字を表す\d
というパターンは[0-9]
で書き換えることができます。[ ]
は範囲を表し、例えば[123]
の場合は、1か2か3ならばマッチします。[1-3]
のようにハイフンを使うことで範囲を指定することもできます。また、^は否定の意味で使われます。
文字の範囲指定に関する記号について次にまとめます。
記号 | 説明 | 備考 |
[ 文字列 ] | 文字列に含まれている1文字 | [abc] の場合、aかbかc |
[ ^文字列 ] | 文字列に含まれていない1文字 | [^abc] の場合、a、b、c以外の文字(dなど) |
[ 文字-文字 ] | 連続した文字範囲に含まれる1文字 | [0-9] の場合、数字 |
[ ^文字-文字 ] | 連続した文字範囲に含まれない1文字 | [^0-9] の場合、数字以外 |
詳細は、先ほどと同じくこちらのページで確認すると良いでしょう。
回数指定の量指定子 { }
郵便番号を表すパターンの「\d{3}-\d{4}
」のうち、{3}
と{4}
は回数指定の量指定子です。\d{3}
の場合、数字を3回繰り返した場合にマッチします。(+
が1回以上、*
が0回以上だったことに対し、){ }
は具体的な繰り返し回数を決めることができます。
これによって、「\d{3}-\d{4}
」は郵便番号の999-9999形式を表すことができます。
繰り返しに関する記号について次にまとめます。詳細はこちらで確認してください。
記号 | 説明 | 備考 |
{n} |
ちょうどn回の一致 | a{2} の場合、aaにマッチ |
{n,} |
n回以上の一致 | a{2,} の場合、aの2回以上の繰り返しにマッチ |
{n,m} |
n回以上m回以下の一致 | a{2,3} の場合、aaかaaaにマッチ |
*? |
できるだけ少ない繰り返しを処理する最初の一致 | 最短一致の* |
+? |
1回以上でできるだけ少ない繰り返し | 最短一致の+ |
?? |
できればゼロ回、できない場合は1回の繰り返し | 最短一致の? |
{n}? |
{n} と同じ |
最短一致の{n} |
{n,}? |
n回以上でできるだけ少ない繰り返し | 最短一致の{n,} |
{n,m}? |
n回以上m回以下でできるだけ少ない繰り返し | 最短一致の{n,m} |
なお、繰り返しは通常、最長一致となります。たとえば、aで始まりbの繰り返しを表すab+
というパターンで「abb」という文字列をチェックすると「abb」全体がマッチングします。これに対して、最短一致のパターンab+?
で「abb」をチェックすると、一番短い少ない繰り返しである「ab」のみがマッチングします。
プログラムで文字列を抽出したり置換する時にマッチング範囲を縮めたい場合には、量指定子の後ろに?
を付けて最短一致にすると良いでしょう。