6

OnSong アプリとの互換性を高めるために、ギター/歌詞用にフォーマットされた標準テキスト ドキュメントのコードの周りに角括弧を追加しようとしています。ルールはありますが、考えられるすべての組み合わせを一致させる方法がわかりません。ルールは次のとおりです。

  • コードは単一の大文字 AG で始まります
  • 大文字の AG の後にスペース、改行、#、b、m、sus、aug、dim、maj、min、または / が続く場合 次の空白または改行まで読みたい (標準的なギター形式のため) 、F#min/E のようなコードも可能で、わざわざ分割するのではなく、スペースまで読み続けたい)
  • 大文字の AG の後に上記のリストにない別の文字が続く場合、正規表現は一致しません (たとえば、名前「Ed」は一致しません)。
  • 「A」に続く単語が有効なコードではないため、「A small world」を一致させない方法を理解できれば、ボーナス ポイントが得られます。
  • 置換が前に(行を開始していないとき)および新しいブラケットの後にスペースを削除できる場合(位置合わせを維持するため)、スーパーボーナスポイント-これは近い和音では失敗することが指摘されました...これは完全です許容できる。

いくつかの注意事項: これはヘルパー スクリプト用です...完璧は必要ありません。今は手作業で行っているので、たまにミスがあっても大丈夫です。コードの詳細を解析しようとしているのではなく、[] でラップするだけです。コード1行、歌詞1行が標準的なレイアウトですが、これは当てにならないので、シナリオによっては失敗することもあると思います。

テストソース (コードは、ミュージシャンがひどい音楽に合わせようとしている場合に備えて、テスト目的でランダムです):

Db    Dsus4/F#           A            Cbmin/C
A man can't be asked for that much to do
D/F#        G         A           D#/E
And I can't sweep you off of your feet

次のようになります。

[Db]  [Dsus4/F#]         [A]          [Cbmin/C]
A man can't be asked for that much to do
[D/F#]      [G]       [A]         [D#/E]
And I can't sweep you off of your feet

私の最初の試みは私に近づきました:

([A-G]((?!\s).)*)

しかし、それはそれらの文字で始まる単語も拾いました. 私は今、ぐるぐる回って、次の範囲までしか到達しませんでした:

\b([CDEFGAB](#|##|b|bb|sus|maj|min|aug)?\b)

使用しようとする[^\s+]と、必要なものをより多く取得するだけでなく、必要なものを捨てるという、さまざまな結果が得られます。私はちょうど私の頭の上にあると思います。どんな助けでも大歓迎であり、それがどのように機能するかについての説明はさらに良いでしょう. 解決策が欲しいのですが、なぜそれが機能するのかを説明したいと思います...

4

5 に答える 5

7

This passes using your sample input and achieves all your "super bonus points" requirements:

String output = input.replaceAll("(?m)(^| )([A-G](##?|bb?)?((sus|maj|min|aug|dim)\\d?)?(/[A-G](##?|bb?)?)?)( (?!\\w)|$)", "[$2]");

This code turns this (as a single String with embedded line fees):

Db    Dsus4/F#           A            Cbmin/C
A man can't be asked for that much to do
D/F#        G         A           D#/E
And I can't sweep you off of your feet

Into this:

[Db]  [Dsus4/F#]         [A]          [Cbmin/C]
A man can't be asked for that much to do
[D/F#]      [G]       [A]         [D#/E]
And I can't sweep you off of your feet
于 2015-03-19T14:04:40.207 に答える
3

あなたが提供したケースに対していくつかの正規表現が機能していますが、他のケースではどのように機能するかわかりません。問題は、行が で始まるA場合や、歌の行にある場合があることです。コードの後に​​スペースと英数字が続くかどうかを確認する否定先読みを使用して、回避しようとしました。スペースと英数字がある場合、このコードは一致しません。の後にコードが繰り返される可能性があるため/、パターンを 2 倍にしています。

\b([CDEFGAB](?:b|bb)*(?:#|##|sus|maj|min|aug)*[\d\/]*(?:[CDEFGAB](?:b|bb)*(?:#|##|sus|maj|min|aug)*[\d\/]*)*)(?=\s|$)(?! \w)

デモをご覧ください。

于 2015-03-19T12:54:06.993 に答える
2

私の場合に役立つように、以前の回答からの回答を少し改善しました。現在、詩の冒頭にある「可能性のあるコード」(A、Eなど)を無視していました。これは私が出てきたものです:

(\(*[CDEFGAB](?:b|bb)*(?:#|##|sus|maj|min|aug|m|M|°|[0-9])*[\(]?[\d\/]*[\)]?(?:[CDEFGAB](?:b|bb)*(?:#|##|sus|maj|min|aug|m|M|°|[0-9])*[\d\/]*)*\)*)(?=[\s|$])(?! [a-z])
于 2017-03-06T11:55:53.707 に答える
0

コードは、私がチェックしたサンプルで協定をうまく実行します

string strRegex = @"^[A-G]([5679bm#]([57])?|1[13]|6\/9|7[-#+b][59]|7?sus[24]|add[249]|aug|dim7?|m\/maj7|m1[13]|m[679]|m7?b5|maj1[13]|maj[79])?([\/][A-G]([5679bm#])?([57])?)?";

Regex myRegex = new Regex(strRegex, RegexOptions.None);
string strTargetString = @"A";
string strReplace = @"[$0]";

return myRegex.Replace(strTargetString, strReplace);
于 2015-03-19T14:47:16.887 に答える