SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

RegexDesigner.NETを使って.NETでの正規表現をマスターする

正規表現を使って効率的なテキスト処理を行う


  • X ポスト
  • このエントリーをはてなブックマークに追加

例3:拡張子がtxtのファイル ~繰り返し「*」「+」「?」~

 例3では、ファイルの拡張子が「txt」になっているかをチェックしてみましょう。

 「03_拡張子がtxtのファイル.rep」を開いてください。パターン文字列が「*\.txt」となっていることを確認し、[Match Text]をクリックします。すると、次のエラーメッセージが表示されます。

例3-1
例3-1

 このエラーメッセージは、「*」という量指定子の前に文字がないためエラーになっています。量指定子とは、文字の繰り返しを表すメタキャラクタです。繰り返しを表す記号であるために、どの文字を繰り返すかを「*」の前につける必要があります。ここでは、拡張子がtxtであればファイル名にはこだわらないため、任意の1文字をあらわすピリオド「.」を「*」の前に記述し、「.*\.txt」とします。

例3-2
例3-2

 この変更で、エラーメッセージは出なくなりました。しかし、「*」は0回以上の繰り返しを意味する量指定子のため、拡張子だけの「.txt」というファイル名にもマッチしてしまっています。そこで、「*」ではなく、1回以上の繰り返しを表す「+」という量指定子を利用するように変更します。

例3-3
例3-3

 このように、「.+\.txt」というパターンによって、拡張子がtxtのファイルをマッチングすることができます。正規表現の量指定子は、ワイルドカードのように単体では動作せず、直前の文字を繰り返すことに注意しておくと良いでしょう。

 次に、繰り返しに関する量指定子についてまとめておきます。

繰り返しに関する記号
記号 説明 備考
* ゼロ回以上の繰り返し {0,}と同義
+ 1回以上の繰り返し {1,}と同義
? ゼロ回または1回 {0,1}と同義

 量指定子についての詳細は、こちらのページを参考にすると良いでしょう。

例4:拡張子がtxtかjpgのファイル ~グループ化 ( )、代替「|」~

 例4では、拡張子がtxtか、またはjpgのファイルにマッチするように設定します。

 「04_拡張子がtxtかjpgのファイル.rep」を開き、[Match Text]をクリックします。

例4-1
例4-1

グループ化

 正規表現では、( )によってグループ化をすることができます。ここでは、( )によって「txt」という文字列をひとかたまりとして扱うようにします。

グループ化に関する記号
記号 説明 備考
( ) グループ化 代替、抽出、置換などで利用できる

 グループ化に関する記号についての詳細は、こちらのページを参考にすると良いでしょう。

代替(または)

 正規表現では、「 | 」というメタキャラクタを使って、代替を表すことができます。例えば、「(cat|dog|fish)」と書けばcatかdogかfishという文字があればマッチさせることができます。なお、代替に関する記号に関する詳細は、こちらのページを参考にすると良いでしょう。

代替に関する記号
記号 説明 備考
| または 縦棒で区切られた単語のいずれかと一致

 ここでは、txtとjpgという拡張子の場合にマッチさせたいので、「.+\.(txt|jpg)」というパターンに変更します。[Match Text]をクリックすると、txtとjpgの両方でマッチしていることが分かります。

例4-2
例4-2

オプションの指定

 なお、RegexDesigner.NETでは、正規表現の照合の動作を変更するオプションを設定することが可能です。例えば、大文字小文字を区別しない場合には、RegExメニューのIgnoreCaseオプションにチェックを入れます。この状態で[Match Text]をクリックすると、JPGやTxtといった拡張子もマッチするようになります。

例4-3
例4-3

 .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

特別な文字群をあらわす記号「\~」

 パターンの「\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」のみがマッチングします。

 プログラムで文字列を抽出したり置換する時にマッチング範囲を縮めたい場合には、量指定子の後ろに?を付けて最短一致にすると良いでしょう。

次のページ
例6:郵便番号(行頭・行末) ~先頭「^」、末尾「$」~

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 青木 淳夫(アオキ アツオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/415 2011/05/22 00:38

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング