2009-10-31 41 views
1

我目前正在編寫腳本編輯應用程序在C#編輯遊戲腳本。我希望能夠加載腳本文件並獲取NPC對象的名稱和腳本內容。該腳本是這樣的:正則表達式:解析C#中的腳本#

INSTANCE PC_Thief(NPC_DEFAULT) 

{ 
    //-------- primary data -------- 
    name   = "Diego"; 
    Npctype   = NPCTYPE_FRIEND; 
    guild   = GIL_STT; 
    level   = 999;   // real 25, aber 999 damit er nicht vor dem Troll flieht! 
    voice   = 11; 
    id    = 1; 
    flags   = NPC_FLAG_IMMORTAL; 

    //-------- visuals -------- 
    //      animations 
    Mdl_SetVisual  (self,"HUMANS.MDS"); 
    //       Body-Mesh   Body-Tex Skin-Color Head-MMS    Head-Tex Teeth-Tex 
    Mdl_SetVisualBody (self,"hum_body_Naked0",  0,   2,   "Hum_Head_Thief", 15,   4, STT_ARMOR_H); 


    //--------- abilities -------- 
    attribute[ATR_STRENGTH]  = 70; 
    attribute[ATR_DEXTERITY] = 90; 
    attribute[ATR_MANA_MAX]  = 0; 
    attribute[ATR_MANA]   = 0; 
    attribute[ATR_HITPOINTS_MAX]= 340; 
    attribute[ATR_HITPOINTS] = 340; 

    protection[PROT_FIRE]  = 1000; 

    Npc_SetTalentSkill (self, NPC_TALENT_PICKPOCKET,1);Npc_SetTalentValue(self,NPC_TALENT_PICKPOCKET,60); 
    Npc_SetTalentSkill (self, NPC_TALENT_SNEAK, 1); 
    Npc_SetTalentSkill (self, NPC_TALENT_PICKLOCK, 1);Npc_SetTalentValue(self,NPC_TALENT_PICKLOCK,60); 
    Npc_SetTalentSkill (self, NPC_TALENT_MAGE,  6); 

    Npc_SetTalentSkill (self, NPC_TALENT_1H,1); 
    Npc_SetTalentSkill (self, NPC_TALENT_BOW,1); 

    //-------- inventory -------- 
    EquipItem   (self, Diegos_Bogen); 
    EquipItem   (self, ItMw_1H_Sword_04); 
    CreateInvItems  (self, ItAmArrow, 100); 

    //-------- ai -------- 
    daily_routine    = Rtn_PreStart_1; 
    fight_tactic    = FAI_HUMAN_MASTER; 
    self.aivar[AIV_IMPORTANT] = TRUE; 
    senses      = SENSE_SEE|SENSE_HEAR|SENSE_SMELL; 
}; 

,這裏是我使用正則表達式:

Regex ireg = new Regex("(instance|prototype)\\s+(?<ins>[^\\s]+).*\\{(?<text>[^(\\};)]+)\\};", RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase | RegexOptions.Singleline); 

然而,當我運行這個Rgex,我拿到小組第一,但所有的組包含有2個換行符。 我在做什麼錯?我將正則表達式設置爲單行模式。也會匹配\ n。這是否是一個錯誤的方式?誰能幫忙?

謝謝。

+0

下一次,你問一個問題,請在指定你想要更詳細的。你甚至沒有提到你想要作爲兩個捕獲組的輸出結果。更好的問題得到更好的答案謝謝:) – Jaskirat 2009-10-31 16:04:57

回答

1

我看了你的意見,我認爲這正則表達式應該做的伎倆

(instance|prototype)\\s+(?<ins>[^\\s(]+)[^{]*{(?<text>[^}]+)}; 

注:根據需要.NET我已經轉義字符

我建議你使用正則表達式這種方式,而不是使用轉義字符用於.NET的,這是乾淨多讀

0。
@"(instance|prototype)\s+(?<ins>[^\s(]+)[^{]*{(?<text>[^}]+)};" 

組 「插件」將包含「PC_Thief」 和「文」將包含的整個輸入捕獲{和}

+0

謝謝。有用! – 2009-10-31 16:18:18

0

甚至不知道你的正則表達式是應該做的,但是這一次應該工作:

"name\s*=\s*\"([^\"]*)\"\s*;" 

的[^ \「]部分匹配什麼,但一個」。如果遊戲腳本允許「使用某種轉義機制裏面的名字,你就必須修改正則表達式。

這裏是一個good place to test regular expressions

+0

我的正則表達式是爲了捕獲1. INSTANCE名稱,例如PC_Thief和2.腳本的全部文本,沒有{和}; 然後將該腳本傳遞給實際分析腳本的另一個函數。 – 2009-10-31 15:38:13

+0

另外很抱歉,我剛剛注意到我的>和<標籤在第一個帖子被吃掉了 - <ins>羣組正確捕獲,但<文本>羣組僅包含2個換行符。 – 2009-10-31 15:40:41

+0

在你發佈的網站上測試了一下之後,我注意到正則表達式匹配};需要結束腳本。那麼,必須逃脫?即使我試圖匹配},正則表達式也不會匹配。我如何正確匹配}? – 2009-10-31 15:47:46