Regex: парсинг скриптов в c # - PullRequest
1 голос
/ 31 октября 2009

В настоящее время я пишу приложение для редактирования сценариев на c # для редактирования игровых сценариев. Я хочу иметь возможность загрузить файл сценария и получить имя объекта NPC и содержимое сценария. Сценарий выглядит так:

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. Это неправильный способ сделать это? Кто-нибудь может помочь?

Спасибо.

Ответы [ 2 ]

1 голос
/ 31 октября 2009

Я прочитал ваши комментарии, и я думаю, что это регулярное выражение должно сделать трюк

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

Примечание. Я уже экранировал символы, необходимые для .net.

Я рекомендую использовать это регулярное выражение вместо использования escape-символа для .net, это намного понятнее для чтения

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

Группа захвата 'ins' будет содержать "PC_Thief" и «текст» будет содержать весь ввод между {и}

0 голосов
/ 31 октября 2009

Даже не уверен, что должен делать ваш регулярный оператор, но этот должен работать:

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

Часть [^ \ "] соответствует чему угодно, кроме". Если игровой сценарий позволяет «внутри имен использовать какой-либо механизм экранирования, вам придется изменить регулярное выражение.

Вот хорошее место для проверки регулярных выражений .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...