0

私は正規表現についてほとんど何も知らないので、これを手伝ってくれる正規表現忍者が必要です。マスクに基づいてファイル名から曲に関する情報を取得できるようにしたいと考えています。次に例を示します。

G:\Music\G\Green Day\(2001) International Superhits!\02. Green Day - Poprocks & Coke.mp3

したがって、マスクは次のようになります。

$artist$\$album$\$track$. $artist$ - $title$.mp3

正規表現は文字列のみを扱っているため、これには最適なようです。誰にも解決策がありますか?

ありがとう、ランディ

PS私はコードを介してそれを行う方法を知っています...正規表現でそれを成し遂げようとしています。

4

2 に答える 2

3

はい、これは正規表現で可能です。自分でマスクを作成する場合は、すぐに正規表現として単純に作成する必要があります。そうでない場合は、それを 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)
...

しかし、それが違いを生む理由を知りたい場合は、リンクされたチュートリアルを読むことをお勧めします. ;)

于 2013-06-13T00:42:40.590 に答える
0

私はこれがあなたのために働くと信じています:

^(?<drive>[^:]+):\\(?<folder>Music)\\(?<subfolder>[^\\]+)\\(?<group>[^(]+)\\\((?<year>[^)]+)\)\s+(?<album>[^\\]+)\\(?<track>[^.]+)\.\s*(?<artist>.+?) - (?<title>[^.]+)\.mp3$

説明のためにそれを分解します:

^                       'start of string
(?<drive>[^:]+)         'named capture group "drive", captures any character except :
:\\                     'finds : followed by "\" ("\" has to be escaped to be a literal "\", so \\ is needed here)
(?<folder>Music)        'named capture group "folder", captures Music
\\                      'finds "\"
(?<subfolder>[^\\]+)    'named capture group "subfolder", captures any character except "\"
\\                      'finds "\"
(?<group>[^(]+)         'named capture group "group", captures any character except "\"
\\                      'finds "\"
\(                      'finds ( (parentheses must be escaped to be a literal "(" or literal ")", so \( is needed here)
(?<year>[^)]+)\)        'named capture group "year", captures any character except "("
\s+                     'finds whitespace
(?<album>[^\\]+)        'named capture group "album", captures any character except "("
\\                      'finds "\"
(?<track>[^.]+)         'named capture group "track", captures any character except "."
\.                      'finds "." (outside of a character class, "." must be escaped, so \. is needed here)
\s*                     'finds whitespace
(?<artist>.+?)          'named capture group "artist", captures any character (lazily)
 -                      'finds " - "
(?<title>[^.]+)         'named capture group "title", captures any character (greedily)
\.mp3                   'finds ".mp3"
$                       'end of string

これは、正規表現の非常に優れたオンライン入門書で​​す: http://www.regular-expressions.info/

オフライン リソースの場合、O'Reilly Media の Jeffrey EF Friedl による「Mastering Regular Expressions」よりもはるかに悪い結果になることは間違いありません。私は第 2 版を持っており、Regex について質問する必要がほとんどないところまで、Regex を理解するのに役立ちました。

また、Jan Goyvaerts の RegexBuddy も購入しました (大好きです)。これは、正規表現を作成して理解するための驚異的なソフトウェアです。

于 2013-06-13T00:42:29.557 に答える