1

txt データベース ファイルを sql コンバーターに書き込んでいますが、項目を行に分割する必要があります。問題は、アイテムの中には、複数のコンマ (db 構造の区切り記号) を保持できるスクリプトが含まれている可能性があることです。良いニュースは、スクリプトが {}-s にネストされているため、csv ファイルの解析に似たジョブになります。唯一の問題は、スクリプト自体が {}-s にネストされたより多くのスクリプトを保持できることです。これにより、数式が機能しなくなります..

txt データベースの構造:

501,Red_Potion,Red Potion,0,50,,70,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(45,65),0; },{},{}
502,Orange_Potion,Orange Potion,0,200,,100,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(105,145),0; },{},{}
503,Yellow_Potion,Yellow Potion,0,550,,130,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(175,235),0; },{},{}
504,White_Potion,White Potion,0,1200,,150,,,,,0xFFFFFFFF,7,2,,,,,,{ itemheal rand(325,405),0; },{},{}

分割の区切り記号を一致させるために使用する正規表現:

,(?![^{}]*\})

これは、次のような、より複雑なネストされたスクリプト項目に対抗するまでは正常に機能します。

1492,Velum_Glaive,Vellum Glaive,4,20,,4500,250,,3,0,0x00004082,7,2,34,4,95,1,5,{ bonus2 bAddRace,RC_DemiHuman,80; if(getrefine()>=6) { bonus2 bSkillAtk,"LK_SPIRALPIERCE",100; bonus2 bSkillAtk,"KN_SPEARBOOMERANG",50; } if(getrefine()>=9) { autobonus2 "{ bonus bShortWeaponDamageReturn,20; bonus bMagicDamageReturn,20; }",100,2000,BF_WEAPON|BF_MAGIC,"{ specialeffect2 EF_REFLECTSHIELD; }"; } },{},{}

では、db 構造の区切り文字のみを一致させ、スクリプト内のコンマを除外するにはどうすればよいでしょうか?

前もって感謝します!:)

4

1 に答える 1

1

これは正規表現の仕事ではありません。コメントで指摘したように、ネストされた構造は通常、正規表現でできることを超えています。PCRE には再帰構造が(?R)あり、.NET にはバランスのとれたグループがありますが、通常、解決策は本当に読みにくく、保守できなくなります。

{}それに加えて、考慮する必要があるのはスクリプト内の文字列とコメントだけではありません。物事を手動で解析する方がはるかに優れています。以下は、PHP を使用して実行する簡単で汚い例です (文字列とコメントは無視されます!)。

$level = 0;
$values = array();
$start = 0;
for($i = 0; $i < strlen($str); $i++)
{
    switch($str[$i])
    {
    case ",":
        if(!$level) {
            $values[] = substr($str, $start, $i-$start);
            $start = $i+1;
        }
        break;
    case "{":
        $level++;
        break;
    case "}":
        $level--;
        if($level < 0) trigger_error("unexpected }");
        break;
    }
}
if($level > 0) trigger_error("missing }");
$values[] = substr($str, $start);

基本的に、スクリプトのパーサーがより単純になることが既にわかります。

于 2013-04-19T10:08:58.717 に答える