2

私はC++コードベースで作業しています。現在、luaスクリプトを呼び出すC ++コードを使用して、コードベース全体を調べ、プログラムで使用されているすべての文字列のリストを返すことを願っています。

問題の文字列の前には、常にTRANSと呼ばれるJUCEマクロがあります。文字列を抽出する必要があるいくつかの例を次に示します

TRANS("Normal")
TRANS ( "With spaces" )
TRANS("")
TRANS("multiple"" ""quotations")
TRANS(")")
TRANS("spans \
multiple \
lines")

そして、大規模なコードベースで発生する可能性のある他のいくつかの可能な文字列バリアントを想像できると確信しています。プロセスを可能な限り自動化するために、JUCE翻訳形式のファイルを生成する自動ツールを作成しています

これらの文字列を見つけるためのパターンマッチングについては、現状ではこれまでのところ取得しています。ソースコードをlua文字列に変換しました

path = ...

--Open file and read source into string
file = io.open(path, "r")
str = file:read("*all")

と呼ばれる

for word in string.gmatch(string, 'TRANS%s*%b()') do print(word) end

TRANSで始まるパターンを見つけ、括弧のバランスが取れています。これにより、角かっこを含む完全なマクロが得られますが、そこから、不要な脂肪を分割して実際の文字列値を保持するのは非常に簡単であると考えました。

ただし、これは括弧の不均衡を引き起こす文字列では機能しません。たとえば、の代わりにTRANS(")")を返しますTRANS(")TRANS("(")

パターンを次のように修正しました

for word in string.gmatch(string, 'TRANS%s*(%s*%b""%s*') do print(word) end

ここで、パターンはTRANSで始まり、次に0または多くのスペースで始まる必要があります。次に、(文字の後に0個以上のスペースが続く必要があります。角かっこ内にあるので、バランスの取れた数の ""マークがあり、その後にさらに0個以上のスペースが続き、最後に)で終わります。残念ながら、これを使用しても単一の値は返されません。でも…思った通りに動いたとしても…\"中身があり、ブラケットのバランスが崩れることがあります。

これらの文字列を抽出するためのアドバイスはありますか?パターンマッチングシーケンスを探し続ける必要がありますか?または、直接アルゴリズムを試す必要があります... 2番目のパターンが文字列を返さなかった理由を知っていますか?その他のアドバイス!私はすべての可能性を100%カバーするつもりはありませんが、100%に近いことは素晴らしいことです。ありがとう!:D

4

2 に答える 2

1

私は誰よりもLuaパターンが大好きですが、あなたは銃撃戦にナイフを持ってきています。これは、ソリューションを正規表現としてコーディングしたくない問題の1つです。ダブルクォートマークとバックスラッシュエスケープを正しく処理するには、実際のパーサーが必要です。LPEGがニーズを適切に管理します。

于 2011-07-05T02:18:18.370 に答える
0

2番目のケースでは、括弧をエスケープするのを忘れました。試す

for word in string.gmatch(str, 'TRANS%s*%(%s*(%b"")%s*%)') do print(word) end
于 2011-07-05T00:35:26.160 に答える