Sto cercando di analizzare una formula chimica (nel formato, ad esempio: Al2O3
o O3
o C
o C11H22O12
) in C# da una stringa. Funziona bene a meno che non ci sia un solo atomo di un particolare elemento (ad esempio l'atomo di ossigeno in H2O
). Come posso risolvere questo problema, e inoltre, c'è un modo migliore per analizzare una stringa di formula chimica di quello che sto facendo?Analizzare una formula chimica da una stringa in C#?
ChemicalElement è una classe che rappresenta un elemento chimico. Ha proprietà AtomicNumber (int), Name (stringa), Symbol (stringa). ChemicalFormulaComponent è una classe che rappresenta un elemento chimico e un conteggio di atomi (ad esempio una parte di una formula). Ha proprietà Element (ChemicalElement), AtomCount (int).
Il resto dovrebbe essere abbastanza chiaro per capire (spero) ma per favore fatemi sapere con un commento se posso chiarire qualsiasi cosa, prima di rispondere.
Ecco il mio codice corrente:
/// <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;
}
Perché si sta verificando se il primo carattere della formula è maiuscolo su ogni iterazione del 'for' loop ('! char.IsUpper (chemicalFormula, 0)')? L'indice qui è sempre '0'. –
Penso che la tua funzione abbia anche problemi con qualcosa come C4O2 è vero? –
Vedere anche la pagina http://stackoverflow.com/questions/2974362/parsing-a-chemical-formula/3742985. Ne richiede uno in Java, con una risposta in Python e collegamenti a soluzioni ANTLR e Python più complesse. –