その他の構成体
.NET Framework の正規表現には、その他の言語構成要素が 3 つ含まれています。 そのうちの 1 つを使用すると、正規表現パターンの途中で特定の一致オプションを有効または無効にできます。 残りの 2 つを使用すると、正規表現にコメントを含めることができます。
インライン オプション
次の構文を使用すると、正規表現の一部に対して、特定のパターン一致オプションを設定したり、無効にしたりできます。
(?imnsx-imnsx)
有効にするオプションは疑問符の後に、無効にするオプションはマイナス記号の後に指定します。 各オプションの説明を次の表に示します。 各オプションの詳細については、「正規表現のオプション」を参照してください。
オプション |
説明 |
---|---|
i |
大文字と小文字を区別しない一致を指定します。 |
m |
複数行モードを指定します。 |
n |
明示的なキャプチャのみを指定します。 かっこはキャプチャ グループとして機能しません。 |
s |
単一行モードを指定します。 |
x |
エスケープされない空白を無視し、x モード コメントを許可します。 |
(?imnsx-imnsx) 構成体で定義した正規表現オプションの変更は、包含するグループの末尾まで有効です。
メモ |
---|
(?imnsx-imnsx:subexpression) グループ化構成体では、同じ機能を部分式に適用できます。詳細については、「グループ化構成体」を参照してください。 |
次の例では、i、n、および x の各オプションを使用して、正規表現の途中で、大文字と小文字を区別しないようにし、明示的なキャプチャを有効にし、正規表現パターン内の空白を無視するようにしています。
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String
Dim input As String = "double dare double Double a Drooling dog The Dreaded Deep"
pattern = "\b(D\w+)\s(d\w+)\b"
' Match pattern using default options.
For Each match As Match In Regex.Matches(input, pattern)
Console.WriteLine(match.Value)
If match.Groups.Count > 1 Then
For ctr As Integer = 1 To match.Groups.Count - 1
Console.WriteLine(" Group {0}: {1}", ctr, match.Groups(ctr).Value)
Next
End If
Next
Console.WriteLine()
' Change regular expression pattern to include options.
pattern = "\b(D\w+)(?ixn) \s (d\w+) \b"
' Match new pattern with options.
For Each match As Match In Regex.Matches(input, pattern)
Console.WriteLine(match.Value)
If match.Groups.Count > 1 Then
For ctr As Integer = 1 To match.Groups.Count - 1
Console.WriteLine(" Group {0}: '{1}'", ctr, match.Groups(ctr).Value)
Next
End If
Next
End Sub
End Module
' The example displays the following output:
' Drooling dog
' Group 1: Drooling
' Group 2: dog
'
' Drooling dog
' Group 1: 'Drooling'
' Dreaded Deep
' Group 1: 'Dreaded'
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern;
string input = "double dare double Double a Drooling dog The Dreaded Deep";
pattern = @"\b(D\w+)\s(d\w+)\b";
// Match pattern using default options.
foreach (Match match in Regex.Matches(input, pattern))
{
Console.WriteLine(match.Value);
if (match.Groups.Count > 1)
for (int ctr = 1; ctr < match.Groups.Count; ctr++)
Console.WriteLine(" Group {0}: {1}", ctr, match.Groups[ctr].Value);
}
Console.WriteLine();
// Change regular expression pattern to include options.
pattern = @"\b(D\w+)(?ixn) \s (d\w+) \b";
// Match new pattern with options.
foreach (Match match in Regex.Matches(input, pattern))
{
Console.WriteLine(match.Value);
if (match.Groups.Count > 1)
for (int ctr = 1; ctr < match.Groups.Count; ctr++)
Console.WriteLine(" Group {0}: '{1}'", ctr, match.Groups[ctr].Value);
}
}
}
// The example displays the following output:
// Drooling dog
// Group 1: Drooling
// Group 2: dog
//
// Drooling dog
// Group 1: 'Drooling'
// Dreaded Deep
// Group 1: 'Dreaded'
この例では、2 つの正規表現を定義しています。 最初の \b(D\w+)\s(d\w+)\b は、大文字の "D" と小文字の "d" で始まる連続する 2 語に一致します。 2 番目の正規表現 \b(D\w+)(?ixn) \s (d\w+) \b は、インライン オプションを使用して、このパターンを次の表に示すように変更しています。 結果の比較により、(?ixn) 構成要素の効果が確認できます。
パターン |
説明 |
---|---|
\b |
ワード境界から開始します。 |
(D\w+) |
大文字の "D" の後に単語に使用される文字が 1 個以上続くパターンに一致します。 これが最初のキャプチャ グループです。 |
(?ixn) |
これ以降、比較で大文字と小文字を区別しないようにし、明示的なキャプチャのみを行い、正規表現パターン内の空白を無視します。 |
\s |
空白文字と一致します。 |
(d\w+) |
大文字または小文字の "d" の後に単語に使用される文字が 1 個以上続くパターンに一致します。 n (明示的なキャプチャ) オプションが有効になっているため、このグループはキャプチャされません。 |
\b |
ワード境界に一致します。 |
インライン コメント
(?# comment) 構成体を使用すると、正規表現にインライン コメントを含めることができます。 コメントのいずれの部分も、正規表現エンジンによるパターン一致に使用されません。ただし、Regex.ToString メソッドで返される文字列には、コメントが含まれます。 コメントは、最初の閉じかっこで終了します。
次の例では、前のセクションの例のうち、最初の正規表現パターンを使用しています。 正規表現に 2 つのインライン コメントを追加して、比較で大文字と小文字を区別するかどうかを示しています。 正規表現パターン \b((?# case-sensitive comparison)D\w+)\s((?#case-insensitive comparison)d\w+)\b は、次のように定義されています。
パターン |
説明 |
---|---|
\b |
ワード境界から開始します。 |
(?# case-sensitive comparison) |
コメント。 これは、パターン一致動作に影響しません。 |
(D\w+) |
大文字の "D" の後に単語に使用される文字が 1 個以上続くパターンに一致します。 これが最初のキャプチャ グループです。 |
\s |
空白文字と一致します。 |
(?ixn) |
これ以降、比較で大文字と小文字を区別しないようにし、明示的なキャプチャのみを行い、正規表現パターン内の空白を無視します。 |
(?#case-insensitive comparison) |
コメント。 これは、パターン一致動作に影響しません。 |
(d\w+) |
大文字または小文字の "d" の後に単語に使用される文字が 1 個以上続くパターンに一致します。 これが 2 番目のキャプチャ グループです。 |
\b |
ワード境界に一致します。 |
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String = "\b((?# case sensitive comparison)D\w+)\s(?ixn)((?#case insensitive comparison)d\w+)\b"
Dim rgx As New Regex(pattern)
Dim input As String = "double dare double Double a Drooling dog The Dreaded Deep"
Console.WriteLine("Pattern: " + pattern.ToString())
' Match pattern using default options.
For Each match As Match In rgx.Matches(input)
Console.WriteLine(match.Value)
If match.Groups.Count > 1 Then
For ctr As Integer = 1 To match.Groups.Count - 1
Console.WriteLine(" Group {0}: {1}", ctr, match.Groups(ctr).Value)
Next
End If
Next
End Sub
End Module
' The example displays the following output:
' Pattern: \b((?# case sensitive comparison)D\w+)\s(?ixn)((?#case insensitive comp
' arison)d\w+)\b
' Drooling dog
' Group 1: Drooling
' Dreaded Deep
' Group 1: Dreaded
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"\b((?# case sensitive comparison)D\w+)\s(?ixn)((?#case insensitive comparison)d\w+)\b";
Regex rgx = new Regex(pattern);
string input = "double dare double Double a Drooling dog The Dreaded Deep";
Console.WriteLine("Pattern: " + pattern.ToString());
// Match pattern using default options.
foreach (Match match in rgx.Matches(input))
{
Console.WriteLine(match.Value);
if (match.Groups.Count > 1)
{
for (int ctr = 1; ctr <match.Groups.Count; ctr++)
Console.WriteLine(" Group {0}: {1}", ctr, match.Groups[ctr].Value);
}
}
}
}
// The example displays the following output:
// Pattern: \b((?# case sensitive comparison)D\w+)\s(?ixn)((?#case insensitive comp
// arison)d\w+)\b
// Drooling dog
// Group 1: Drooling
// Dreaded Deep
// Group 1: Dreaded
行末コメント
シャープ記号 (#) は x モード コメントを示します。このコメントは、正規表現パターンの末尾にあるエスケープされない # 文字から行末までです。 この構成体を使用するには、x オプションを (インライン オプションで) 有効にするか、Regex オブジェクトのインスタンス化時または Regex 静的メソッドの呼び出し時に RegexOptions.IgnorePatternWhitespace 値を option パラメーターに指定する必要があります。
行末コメント構成体を次の例に示します。 この例では、文字列が、1 つ以上の書式指定項目を含む複合書式指定文字列であるかどうかを判断しています。 正規表現パターンの構成要素の説明を次の表に示します。
\{\d+(,-*\d+)*(\:\w{1,4}?)*\}(?x) # Looks for a composite format item.
パターン |
説明 |
---|---|
\{ |
左中かっこ ({) に一致します。 |
\d+ |
1 個以上の 10 進数と一致します。 |
(,-*\d+)* |
コンマの後に省略可能なマイナス記号、その後に 1 個以上の 10 進数が続くパターンに 0 回または 1 回一致します。 |
(\:\w{1,4}?)* |
コロンの後に 1 ~ 4 個の (できるだけ少ない) 空白文字が続くパターンに 0 回または 1 回一致します。 |
(?#case insensitive comparison) |
インライン コメントです。 これは、パターン一致動作に影響しません。 |
\} |
右中かっこ (}) に一致します。 |
(?x) |
行末コメントが認識されるように、パターンの空白を無視するオプションを有効にします。 |
# Looks for a composite format item. |
行末コメントです。 |
Imports System.Text.RegularExpressions
Module Example
Public Sub Main()
Dim pattern As String = "\{\d+(,-*\d+)*(\:\w{1,4}?)*\}(?x) # Looks for a composite format item."
Dim input As String = "{0,-3:F}"
Console.WriteLine("'{0}':", input)
If Regex.IsMatch(input, pattern) Then
Console.WriteLine(" contains a composite format item.")
Else
Console.WriteLine(" does not contain a composite format item.")
End If
End Sub
End Module
' The example displays the following output:
' '{0,-3:F}':
' contains a composite format item.
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"\{\d+(,-*\d+)*(\:\w{1,4}?)*\}(?x) # Looks for a composite format item.";
string input = "{0,-3:F}";
Console.WriteLine("'{0}':", input);
if (Regex.IsMatch(input, pattern))
Console.WriteLine(" contains a composite format item.");
else
Console.WriteLine(" does not contain a composite format item.");
}
}
// The example displays the following output:
// '{0,-3:F}':
// contains a composite format item.
正規表現に (?x) 構成要素を指定する代わりに、Regex.IsMatch(String, String, RegexOptions) メソッドを呼び出して RegexOptions.IgnorePatternWhitespace 列挙値を渡すことによっても、コメントを認識されるようにすることができます。