はい、これは正規表現で可能です。自分でマスクを作成する場合は、すぐに正規表現として単純に作成する必要があります。そうでない場合は、それを 1 つに変換する必要がありますが、パターンがどのように見えるかがわかれば、それほど難しいことではありません。
主な問題は、これらの変数に何が含まれるかということです。簡単にするために、それぞれにバックスラッシュ以外の任意の文字を含めることができると仮定します。このような文字は と一致し[^\\]
ます。これは、内部に含まれる文字を除くすべてに一致する否定文字クラスです (最初のバックスラッシュは 2 番目のバックスラッシュをエスケープします)。これを繰り返すことができます+
(少なくとも 1 文字が必要です)。トラックについては、例外を設けて、数字のみを許可します。
それはあなたのパターンを次のようにします
[^\\]+\\[^\\]+\\\d+[.]\s*[^\\]+\s*-\s*[^\\]+[.]mp3$
これ$
は、パターンを文字列の最後に固定することです。
ピリオドを文字クラスに入れていることに注意してください。それ以外の場合は、改行以外の任意の文字に一致します。ピリオドをエスケープすることもできますが、読みやすさのために文字クラスを好みます。\s*
スペースについては、空白をまったく含まない任意の量 (および種類) の空白に一致するを使用しました。
問題は、これを変数に取り込む方法です。目的の部分を括弧で囲むことで、試合の一部をキャプチャできます。しかし、さらに便利なのは、(?<name>pattern)
構文を使用してこれらのキャプチャに名前を付けることができることです。このような:
(?<artist>[^\\]+)\\(?<album>[^\\]+)\\(?<track>\d+)[.]\s*(?<artist>[^\\]+)\s*-\s*(?<title>[^\\]+)[.]mp3$
最後に、どのように結果にアクセスしますか?
Dim text As String = "G:\Music\G\Green Day\(2001) International Superhits!\02. Green Day - Poprocks & Coke.mp3"
Dim pattern As String = "(?<artist>[^\\]+)\\(?<album>[^\\]+)\\(?<track>\d+)[.]\s*(?<artist>[^\\]+)\s*-\s*(?<title>[^\\]+)[.]mp3$"
' Instantiate the regular expression object.
Dim r As Regex = new Regex(pattern)
' Match the regular expression pattern against a text string.
Dim m As Match = r.Match(text)
If m.Success Then
' get results from m.Groups["artist"].Value etc.
もう1つの微妙な点があります。マスク/パターンにアーティストが 2 回含まれています。.NET では、グループ名が繰り返されても問題はありません。問題は、それらが 2 つの異なる名前である状況をどのように処理するかです。上に書いたコードは、2 つのバージョンのうちの後者を提供するだけです。m.Groups["artist"].Captures[0].Value
実際には、とで両方にアクセスできますm.Groups["artist"].Captures[1].Value
。
両方が同じであり、同じでない場合は一致しないと主張したい場合は、2 番目のグループの代わりに後方参照を使用できます。後方参照は、参照するグループによってキャプチャされたものと正確に一致します。
(?<artist>[^\\]+)\\(?<album>[^\\]+)\\(?<track>\d+)[.]\s*\k<artist>\s*-\s*(?<title>[^\\]+)[.]mp3$
は、パスで見つかったもの\k<artist>
と正確に一致することを確認します。artist
ピートのように、私はこのチュートリアルしかお勧めできません. 上記で使用した構成についてさらに理解を深めるには、特に次のサブセクションを確認してください。
正規表現を学ぶことは間違いなくあなたの時間の価値があります. それらで簡単に解決できる別の問題に確実に遭遇するだけでなく、選択したテキストエディターでの単純な検索と置換タスクに関しては、生産性が大幅に向上します.
編集:最後に 1 つのメモ。このパターンを頻繁に使用し、パフォーマンスが重要な場合は、.NET の右から左へのモードを使用することで多くのメリットが得られる可能性があります。次のようにアクティブ化できます
...
Dim r As Regex = new Regex(pattern, RegexOptions.RightToLeft)
...
しかし、それが違いを生む理由を知りたい場合は、リンクされたチュートリアルを読むことをお勧めします. ;)