与えられたパス
C:\Users\Bob\Downloads\Product12\Prices\USD
と呼ばれるサブディレクトリが含まれていることだけを知っているDownloads
ダウンロード部分を見つけるためにこの正規表現があります
(?<=Downloads\\)[^\\""]*
理想的には、ダウンロードの後のすべてを別のグループとして一致させたいと考えていますが、ダウンロードと次のパス部分の両方に単一の正規表現を使用しています。
this will match everything before 'downloads' in one subgroup, and everything after in another subgroup:
/^(.*?Downloads\\)(.*)$/
パスを解析するために正規表現は必要ありません
var paths = new Uri(@"C:\Users\Bob\Downloads\Product12\Prices\USD").Segments;
はすべてのセグメントを返し、 までスキップできますDownloads
。例えば
var paths = new Uri(@"C:\Users\Bob\Downloads\Product12\Prices\USD")
.Segments
.SkipWhile(s => s != "Downloads/")
.Skip(1)
.ToList();
サンプル入力が与えられた場合、 を取得したいと思いますよProduct12\Prices\USD
ね?
result = Regex.Match(s, @"\\Downloads\\(.*)$").Groups[1].Value;
しかし[\\""]*
、正規表現では、パスが引用符で囲まれていることを示しているようであり、終了引用符またはその後の何かとの一致は必要ありません。
result = Regex.Match(s, @"\\Downloads\\([^""]*)""").Groups[1].Value;
特に興味深い点は次のとおりです。
C# で正規表現を作成するときは、可能な場合は常に C# のそのままの文字列表記を使用してください (つまり、@"regex"
. コードにたくさんのバックスラッシュを追加する必要がなくなります。たとえば、正規表現が標準の C スタイルの文字列リテラルである場合、正規表現で4 つのバックスラッシュを使用して、1 つのバックスラッシュ入力に一致させる必要があります。
ここ SO の投稿に正規表現を含める場合は、コードに表示されるとおりに表示してください。バックスラッシュの意味を推測する必要はありません。たとえば、\\
in[^\\""]*
はリテラルのバックスラッシュと一致するはずですか、それとも正規表現のためにエスケープしているだけですか?
引用符といえば、"
正規表現では特別な意味がないため、エスケープする必要はありません。[^""]*
逐語的な文字列で引用符をエスケープする方法であるため、そのシーケンスを に変更しました。C スタイルの文字列リテラルでは、[\\"]*
.