private Monster ParseMonsterMatch(string name, string statBlock)
        {
            statBlock = statBlock.Trim();

            var firstLine = statBlock.PopToken(PopType.Newline, out statBlock).Replace("*", string.Empty);

            var monster = new Monster
            {
                Name      = name.Trim(),
                Size      = firstLine.PopToken(PopType.Space, out firstLine),
                Type      = firstLine.PopToken(PopType.Comma, out firstLine),
                Alignment = firstLine.Trim(),
            };

            Extract.AC(monster, ref statBlock);
            Extract.HPAndDice(monster, ref statBlock);
            Extract.Speed(monster, ref statBlock);
            Extract.Skills(monster, ref statBlock);
            Extract.Senses(monster, ref statBlock);
            Extract.Languages(monster, ref statBlock);
            Extract.Saves(monster, ref statBlock);
            Extract.DamageImmunities(monster, ref statBlock);
            Extract.DamageResistances(monster, ref statBlock);
            Extract.DamageVulnerabilities(monster, ref statBlock);
            Extract.ConditionImmunities(monster, ref statBlock);

            Extract.Challenge(monster, ref statBlock);
            Extract.LegendaryResistances(monster, ref statBlock);

            Extract.Attributes(monster, ref statBlock);

            Extract.LegendaryActions(monster, ref statBlock);
            Extract.Reactions(monster, ref statBlock);
            Extract.Actions(monster, ref statBlock);

            Extract.InnateSpellcasting(monster, ref statBlock);
            Extract.Spellcasting(monster, ref statBlock);

            monster.WhatsLeft = statBlock;
            return(monster);
        }