====== 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 ^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')