C# で以下の形式で始まるテキストを読み取るための正規表現パターンを作成するにはどうすればよいですか。
"Sec. 1.01."
"Sec. 1.02."
"Sec. 47.01."
"Sec. 47.06."
"Sec. 71.022."
Sec\.\s\d+\.\d+\.
上記の正規表現が機能する可能性があります。
Sec
完全に一致 秒
\.
に一致 ドット
\s
に一致 スペース
\d
に一致 数字 (数字)
\d+
に一致 1 つ以上の数字
に一致 引用符も一致させたい場合"
は、正規表現の先頭と末尾に追加します。
正規表現を作ろう!
最初に、リテラル テキスト (空白を含む) と一致させたいと考えています。ただし、ドットをエスケープする必要があります。
"Sec\. "
次に、1 つ以上の数字を照合します。\d
数字に+
一致し、上記の 1 つまたは複数に一致します。
"\d+"
次に、別のドットが再びエスケープされました。
"\."
次に、1 つ以上の数字の別のシーケンス:
"\d+"
そして最後に別のドットがエスケープされました:
"\."
このフォームをまとめる:
"Sec\. \d+\.\d+\."
と 数字の間の空白がSec.
常に単一のスペースであるとは限らない場合 (たとえば、一連のスペースやタブ)、\s
空白クラスとを使用し+
て複数回一致させることができます ( "\s+"
):
"Sec\.\s+\d+\.\d+\."
正規表現が行の先頭と末尾にも一致する必要がある場合、 は先頭と末尾に^
一致$
します。
"^Sec\.\s+\d+\.\d+\.$"
最後に、これを C# で使用する場合は、C# が@
スラッシュを正しく解釈しないように、文字列の前に を付ける必要があります。
string pattern = @"^Sec\.\s+\d+\.\d+\.$";
式の一部をキャプチャする場合は、キャプチャ グループ( として記述) を使用できます(?<name> regex )
。たとえば、数値部分をキャプチャするには、次のようにします。
string pattern = @"^Sec\.\s+(?<num>\d+\.\d+)\.$";
これで、文字列の数値部分を取得できます。
Regex regex = new Regex(pattern);
var match = regex.Match("Sec. 71.022.");
string num = match.Groups["num"].Value;
// num = "71.022"
正規表現リファレンスには、これらすべてとそれ以上のものがあります。
MatchCollection mc = Regex.Matches(a, @"^Sec[.]\s(?:\d*[.]){2}$");
foreach (Match item in mc)
{
Console.WriteLine(item.Value);
}