Разбирать химическую формулу из строки в C #?

Я пытаюсь разобрать химическую формулу (в формате, например: Al2O3 или O3] или C или C11H22O12 ) в C # из строки. Он работает нормально, если только один атом определенного элемента (например, атом кислорода в H2O ). Как я могу исправить эту проблему и, кроме того, есть ли лучший способ проанализировать строку химической формулы, чем я делаю?

ChemicalElement - это класс, представляющий химический элемент. У него есть свойства AtomicNumber (int), Name (строка), Symbol (строка). ChemicalFormulaComponent - это класс, представляющий химический элемент и количество атомов (например, часть формулы). У него есть свойства Element (ChemicalElement), AtomCount (int).

Остальное должно быть достаточно ясным для понимания (я надеюсь), но, пожалуйста, дайте мне знать с комментарием, если я могу что-то уточнить, прежде чем вы ответите.

Здесь это мой текущий код:

    /// <summary>
    /// Parses a chemical formula from a string.
    /// </summary>
    /// <param name="chemicalFormula">The string to parse.</param>
    /// <exception cref="FormatException">The chemical formula was in an invalid format.</exception>
    public static Collection<ChemicalFormulaComponent> FormulaFromString(string chemicalFormula)
    {
        Collection<ChemicalFormulaComponent> formula = new Collection<ChemicalFormulaComponent>();

        string nameBuffer = string.Empty;
        int countBuffer = 0;

        for (int i = 0; i < chemicalFormula.Length; i++)
        {
            char c = chemicalFormula[i];

            if (!char.IsLetterOrDigit(c) || !char.IsUpper(chemicalFormula, 0))
            {
                throw new FormatException("Input string was in an incorrect format.");
            }
            else if (char.IsUpper(c))
            {
                // Add the chemical element and its atom count
                if (countBuffer > 0)
                {
                    formula.Add(new ChemicalFormulaComponent(ChemicalElement.ElementFromSymbol(nameBuffer), countBuffer));

                    // Reset
                    nameBuffer = string.Empty;
                    countBuffer = 0;
                }

                nameBuffer += c;
            }
            else if (char.IsLower(c))
            {
                nameBuffer += c;
            }
            else if (char.IsDigit(c))
            {
                if (countBuffer == 0)
                {
                    countBuffer = c - '0';
                }
                else
                {
                    countBuffer = (countBuffer * 10) + (c - '0');
                }
            }
        }

        return formula;
    }
8
задан Jake Petroules 7 November 2010 в 06:59
поделиться