dotnet:regex

Regex クラス (System.Text.RegularExpressions)

 Windowsのファイルシステムでは、ファイル名やフォルダ名の比較を行う際に大文字/小文字を区別しない。そのため、「ファイル名が正規表現パターンにマッチするか?」というような処理を記述する場合、正規表現はデフォルトで大文字/小文字を区別してしまうので注意が必要である。

 以下の例では、Regex クラスの引数に RegexOptions.IgnoreCase を指定することで、大文字/小文字を区別しないで正規表現のパターンマッチを行っている。

[VB]

Imports System
Imports System.Text.RegularExpressions
 
Module SampleAppVB
    Private Sub IsMatchFileName(ByVal fileName As String, ByVal pattern As String)
        If Regex.IsMatch(fileName, pattern, _
                RegexOptions.IgnoreCase) Then   ' 大文字/小文字を区別しない
            Console.WriteLine( _
                "ファイル名: '{0}' はパターン: '{1}' にマッチしました。", _
                fileName, pattern)
        Else
            Console.WriteLine( _
                "ファイル名: '{0}' はパターン: '{1}' にマッチしません。", _
                fileName, pattern)
        End If
    End Sub
 
    Sub Main()
        Dim fileName1 As String = "AAA_00001.txt"
        Dim fileName2 As String = "AAA_00001.txt"
        ' 半角ファイル名の正規表現
        Const TARGET_FILENAME_REGEX As String = "aaa_\d{5}.txt"
        ' 全角ファイル名の正規表現
        Const TARGET_FILENAME_MULTI_BYTE_REGEX As String = "aaa_\d{5}.txt"
 
        ' ファイル名のパターンマッチ
        IsMatchFileName(fileName1, TARGET_FILENAME_REGEX)
        IsMatchFileName(fileName2, TARGET_FILENAME_MULTI_BYTE_REGEX)
        IsMatchFileName(fileName1, TARGET_FILENAME_MULTI_BYTE_REGEX)
        IsMatchFileName(fileName2, TARGET_FILENAME_REGEX)
    End Sub
End Module

[C#]

using System;
using System.Text.RegularExpressions;
 
namespace SampleApplicationCS
{
    public class SampleAppCS
    {
        // ファイル名がパターンにマッチするかをテストしてコンソールに結果を出力
        private static void IsMatchFileName(string fileName, string pattern)
        {
            if (Regex.IsMatch(fileName, pattern,
                RegexOptions.IgnoreCase))   // 大文字/小文字を区別しない
            {
                Console.WriteLine(
                    "ファイル名: '{0}' はパターン: '{1}' にマッチしました。",
                    fileName, pattern);
            }
            else
            {
                Console.WriteLine(
                    "ファイル名: '{0}' はパターン: '{1}' にマッチしません。",
                    fileName, pattern);
            }
        }
 
        static void Main(string[] args)
        {
            string fileName1 = @"AAA_00001.txt";
            string fileName2 = @"AAA_00001.txt";
            // 半角ファイル名の正規表現
            const string TARGET_FILENAME_REGEX = @"aaa_\d{5}.txt";
            // 全角ファイル名の正規表現
            const string TARGET_FILENAME_MULTI_BYTE_REGEX = @"aaa_\d{5}.txt";
 
            // ファイル名のパターンマッチ
            IsMatchFileName(fileName1, TARGET_FILENAME_REGEX);
            IsMatchFileName(fileName2, TARGET_FILENAME_MULTI_BYTE_REGEX);
            IsMatchFileName(fileName1, TARGET_FILENAME_MULTI_BYTE_REGEX);
            IsMatchFileName(fileName2, TARGET_FILENAME_REGEX);
        }
    }
}

[C++]

using namespace System;
using namespace System::Text::RegularExpressions;
 
static void IsMatchFileName(String^ fileName, String^ pattern)
{
	if (Regex::IsMatch(fileName, pattern,
		RegexOptions::IgnoreCase))   // 大文字/小文字を区別しない
    {
		Console::WriteLine(
            "ファイル名: '{0}' はパターン: '{1}' にマッチしました。",
            fileName, pattern);
    }
    else
    {
		Console::WriteLine(
            "ファイル名: '{0}' はパターン: '{1}' にマッチしません。",
            fileName, pattern);
    }
}
 
int main(array<System::String ^> ^args)
{
	String^ fileName1 = "AAA_00001.txt";
	String^ fileName2 = "AAA_00001.txt";
	// 半角ファイル名の正規表現
	const String^ TARGET_FILENAME_REGEX = "aaa_\\d{5}.txt";
	// 全角ファイル名の正規表現
	const String^ TARGET_FILENAME_MULTI_BYTE_REGEX = "aaa_\\d{5}.txt";
 
	// ファイル名のパターンマッチ
	IsMatchFileName(fileName1, (String^)TARGET_FILENAME_REGEX);
	IsMatchFileName(fileName2, (String^)TARGET_FILENAME_MULTI_BYTE_REGEX);
	IsMatchFileName(fileName1, (String^)TARGET_FILENAME_MULTI_BYTE_REGEX);
	IsMatchFileName(fileName2, (String^)TARGET_FILENAME_REGEX);
 
	return 0;
}

[実行結果]

ファイル名: 'AAA_00001.txt' はパターン: 'aaa_\d{5}.txt' にマッチしました。
ファイル名: 'AAA_00001.txt' はパターン: 'aaa_\d{5}.txt' にマッチしました。
ファイル名: 'AAA_00001.txt' はパターン: 'aaa_\d{5}.txt' にマッチしません。
ファイル名: 'AAA_00001.txt' はパターン: 'aaa_\d{5}.txt' にマッチしません。

[VB]

Imports System
Imports System.Text.RegularExpressions
 
Module SampleAppVB
    Sub Main()
        Dim fileName1 As String = "fileA_20090304_00001.txt"
        Dim fileName2 As String = "fileB_20090305_00002.txt"
 
        ' グループ名定義
        Const REGEX_GROUP_DATE As String = "date"       ' 日付
        Const REGEX_GROUP_COUNTER As String = "counter" ' カウンタ
        ' ファイル名の正規表現
        Const TARGET_FILENAME_REGEX As String = _
            "file[AB]_" & _
            "(?<" & REGEX_GROUP_DATE & ">\d{8})_" & _
            "(?<" & REGEX_GROUP_COUNTER & ">\d{5}).txt"
 
        ' パターンマッチ情報を取得
        Dim mt1 As Match = Regex.Match(fileName1, TARGET_FILENAME_REGEX)
 
        ' 日付、および、カウンタを抽出して表示
        Console.WriteLine( _
            "ファイル名: '{0}' (日付: '{1}'、カウンタ: '{2}')", _
            fileName1, _
            mt1.Groups(REGEX_GROUP_DATE).Value, _
            mt1.Groups(REGEX_GROUP_COUNTER).Value)
 
        ' パターンマッチ情報を取得
        Dim mt2 As Match = Regex.Match(fileName2, TARGET_FILENAME_REGEX)
 
        ' 日付、および、カウンタを抽出して表示
        Console.WriteLine( _
            "ファイル名: '{0}' (日付: '{1}'、カウンタ: '{2}')", _
            fileName2, _
            mt2.Groups(REGEX_GROUP_DATE).Value, _
            mt2.Groups(REGEX_GROUP_COUNTER).Value)
    End Sub
End Module

[実行結果]

ファイル名: 'fileA_20090304_00001.txt' (日付: '20090304'、カウンタ: '00001')
ファイル名: 'fileB_20090305_00002.txt' (日付: '20090305'、カウンタ: '00002')
  • dotnet/regex.txt
  • 最終更新: 2019/05/18 02:23
  • by 非ログインユーザー