Tôi đang cố gắng phân tích cú pháp công thức hóa học (theo định dạng, ví dụ: Al2O3
hoặc O3
hoặc C
hoặc C11H22O12
) bằng C# từ một chuỗi. Nó hoạt động tốt trừ khi chỉ có một nguyên tử của một nguyên tố cụ thể (ví dụ: nguyên tử oxy trong H2O
). Làm thế nào tôi có thể khắc phục vấn đề đó, và ngoài ra, có cách nào tốt hơn để phân tích một chuỗi công thức hóa học hơn tôi đang làm không?Phân tích cú pháp một công thức hóa học từ một chuỗi trong C#?
ChemicalElement là một lớp đại diện cho một nguyên tố hóa học. Nó có các thuộc tính AtomicNumber (int), Name (string), Symbol (string). ChemicalFormulaComponent là một lớp đại diện cho phần tử hóa học và số nguyên tử (ví dụ: một phần của công thức). Nó có các thuộc tính Element (ChemicalElement), AtomCount (int).
Phần còn lại phải đủ rõ ràng để hiểu (tôi hy vọng) nhưng xin vui lòng cho tôi biết bằng một bình luận nếu tôi có thể làm rõ bất cứ điều gì, trước khi bạn trả lời.
Đây là mã hiện tại của tôi:
/// <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;
}
Tại sao các bạn kiểm tra xem ký tự đầu tiên của công thức là chữ in hoa trên mỗi iteration của 'for' loop ('! char.IsUpper (chemicalFormula, 0)')? Chỉ mục ở đây luôn là '0'. –
Tôi nghĩ rằng chức năng của bạn cũng có vấn đề với một cái gì đó như C4O2 là điều này đúng? –
Xem thêm trang http://stackoverflow.com/questions/2974362/parsing-a-chemical-formula/3742985. Nó yêu cầu một trong Java, với một câu trả lời trong Python, và liên kết đến các giải pháp ANTLR và Python phức tạp hơn. –