Ich versuche, eine chemische Formel (in dem Format, zum Beispiel: Al2O3
oder O3
oder C
oder C11H22O12
) in C# von einer Zeichenfolge zu analysieren. Es funktioniert gut, es sei denn, es gibt nur ein Atom eines bestimmten Elements (z. B. das Sauerstoffatom in H2O
). Wie kann ich dieses Problem beheben, und gibt es außerdem eine bessere Methode zum Analysieren einer chemischen Formelzeichenfolge als das, was ich tue?Analysieren einer chemischen Formel aus einer Zeichenfolge in C#?
ChemicalElement ist eine Klasse, die ein chemisches Element darstellt. Es hat Eigenschaften AtomicNumber (int), Name (string), Symbol (string). ChemicalFormulaComponent ist eine Klasse, die ein chemisches Element und eine Atomzahl darstellt (z. B. Teil einer Formel). Es hat Eigenschaften Element (ChemicalElement), AtomCount (int).
Der Rest sollte klar genug sein, um zu verstehen (ich hoffe), aber bitte lassen Sie mich mit einem Kommentar wissen, wenn ich etwas klären kann, bevor Sie antworten.
Hier ist mein aktueller Code:
/// <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;
}
Warum Prüfen Sie, ob das erste Zeichen der Formel bei jeder Iteration des 'for' oberen Fall ist Schleife ('! char.IsUpper (chemicalFormula, 0)')? Der Index hier ist immer "0". –
Ich denke, deine Funktion hat auch Probleme mit etwas wie C4O2 ist das wahr? –
Siehe auch die Seite http://stackoverflow.com/questions/2974362/parsing-a-chemical-formula/3742985. Es fragt nach einem in Java mit einer Antwort in Python und Links zu komplexeren ANTLR- und Python-Lösungen. –