0

まず最初に、私は正規表現についてまったく何も知らないことをはっきりさせておきますが、MusicBrainz Picard の「Tagger Script」を作成して、トラックのタイトルの特定の側面をフォーマットする方法を台無しにしないようにする必要があります。

ここで私がする必要があるのは次のとおりです: - 括弧内のすべての部分文字列を検索します - 次に、指定された基準を満たす一致とそれらの一致のみについて、括弧を括弧に変更します

たとえば、次のストリングを考えてみましょう: DJ Fresh - Louder (Sian Evans) (Flux Pavilion & Doctor P Remix)

DJ Fresh - Louder (Sian Evans) [Flux Pavilion & Doctor P Remix] のように変更する必要があります。

条件は、括弧内の文字列に「dj」、「mix」、「version」、「inch」などの部分文字列が含まれている場合、それを囲む括弧を括弧に変更する必要があることです。

問題は、この操作を実行できる正規表現を 1 つ作成することは可能かということです。

事前にどうもありがとうございました。

4

1 に答える 1

3

ネストされた括弧がないと仮定すると、次の正規表現を使用してテキストを検索できます。

(?i)\((?=[^()]*(?:dj|mix|version|inch))([^()]+)\)

regex は大文字と小文字を区別しないことに注意してください。これは、(?i)in front - を削除して大文字と小文字を区別するためです。

言語の構文を調べて、rプレフィックスを使用できるかどうかを確認してください。たとえばr'literal_string'、リテラル文字列を指定できます。

そして、代わりに以下を使用します。

[$1]

(?:dj|mix|version|inch)各キーワードを で区切って part にキーワードを追加することで、より多くのキーワードを含めることができます|。キーワードに(, ), [, ], |, , , ., +,?*含まれている場合は^、それらをエスケープする必要があります (リストが網羅的であると 99% 確信しています) 。これについて考える簡単な方法は次のとおりです。キーワードにスペースと英数字のみが含まれている場合 (ただし、スペースの数は厳密であることに注意してください)、副作用を引き起こすことなくそれらを正規表現に追加できます。$\{}


正規表現の分析:

  • (?i):大文字と小文字を区別しないモード

  • \(:(は正規表現の特殊文字です。先頭に を付けてエスケープする必要があり\ます。

  • (?=[^()]*(?:dj|mix|version|inch)): 前向き先読み(?=pattern):

    • [^()]*: テキストが括弧の外側や他の括弧内ではなく、括弧内にあることを確認する必要があるため、否定文字クラスを使用して[^characters]一致を回避()し、現在の括弧の外側にスピルします。私が立てた仮定もここで少し作用します。

    • (?:dj|mix|version|inch):非キャプチャ グループ 内のキーワードのリスト(?:pattern)|交代を意味します。

  • ([^()]+): 括弧がネストされていないという仮定により、括弧内のすべての文字を簡単に一致させることができます。とは対照的に、 はキャプチャ グループであるため、テキストは後で置換するためにキャプチャされます。(pattern)(?:pattern)

  • \):)は正規表現の特殊文字です。先頭に を付けてエスケープする必要があり\ます。

于 2013-01-12T05:08:39.110 に答える