Estoy trabajando en un programa que requiere cálculos de masa molar de fórmulas químicas, por lo que he creado una solución que funciona con una variedad de fórmulas.
Por ejemplo, "(CH3) 16 (Tc (H2O) 3CO (BrFe3 (ReCl _) 3 (SO4) 2) 2) 2MnO4" resultará en "16C 48H 2TC 12H 6O 2C 2O 4Br 12FE 12Re 12CL 8S 32O Mn 4O "(este compuesto está compuesto, pero bueno, ¡funciona!)
Este código está escrito en C# por eso no lo he publicado. Si está interesado, puedo publicarlo para usted. De hecho, escribí una respuesta completa antes de notar la etiqueta java.
De todos modos, funciona básicamente agrupando bloques de átomos combinados por paréntesis recursivamente. No maneja coeficientes como 2Pb (pero (Pb) 2 o Pb2 funciona) o compuestos cargados como OH-.
De ninguna manera es simple o elegante. Quería una solución de trabajo, así que sé que hay formas mejores (¡ni siquiera probé expresiones regulares!). Pero funciona con las fórmulas que necesito, tal vez también se adapte a la tuya.
Aquí hay algunos casos de prueba en los que lo ejecuto. Eche un vistazo a ellos y avíseme si el código C# aún le sería útil. El formato es (entrada, salida esperada)
("Pb ", " Pb");
("H ", " H");
("Pb2 ", " 2Pb");
("H2 ", " 2H");
("3Pb2 ", " 6Pb");
("Pb2SO4", " 2Pb S 4O");
("PbH2 ", " Pb 2H");
("(PbH2)2 ", " 2Pb 4H");
("(CCC)2 ", " 2C 2C 2C");
("Pb(H2)2 ", " Pb 4H");
("(Pb(H2)2)2 ", " 2Pb 8H");
("(Pb(H2)2)2NO3 ", " 2Pb 8H N 3O");
("(Ag(Pb(H2)2)2)2SO4 ", " 2Ag 4Pb 16H S 4O");
("Pb(CH3(CH2)2CH3)2", " Pb 2C 6H 4C 8H 2C 6H");
("Na2(CH3(CH2)2CH3)2", " 2Na 2C 6H 4C 8H 2C 6H");
("Tc(H2O)3Fe3(SO4)2", " Tc 6H 3O 3Fe 2S 8O");
("Tc(H2O)3(Fe3(SO4)2)2", " Tc 6H 3O 6Fe 4S 16O");
("(Tc(H2O)3(Fe3(SO4)2)2)2", " 2Tc 12H 6O 12Fe 8S 32O");
("(Tc(H2O)3CO(Fe3(SO4)2)2)2", " 2Tc 12H 6O 2C 2O 12Fe 8S 32O");
("(Tc(H2O)3CO(BrFe3(ReCl)3(SO4)2)2)2MnO4", " 2Tc 12H 6O 2C 2O 4Br 12Fe 12Re 12Cl 8S 32O Mn 4O");
("(CH3)16(Tc(H2O)3CO(BrFe3(ReCl)3(SO4)2)2)2MnO4", " 16C 48H 2Tc 12H 6O 2C 2O 4Br 12Fe 12Re 12Cl 8S 32O Mn 4O");
No soy un gran experto en química pero, como recuerdo, pueden existir construcciones más complicadas, como (NH4) 2SO4, que se debe traducir a [N, N, H, H, H, H, H, H, H, H, S, O, O, O, O]. También recuerdo que ese complejo * complejo parece muy complicado. ¿Deberías programar manejar estos casos? – Roman
Sería más útil si pudieras decir exactamente cómo estás resolviendo este problema y qué es lo que estás tratando de evitar. – MAK
Tengo todo el otro código, solo estoy tratando de encontrar una manera de dividir la fórmula en bits más pequeños. Quiero que sea capaz de trabajar en fórmulas anidadas en varias capas de parenteses. Simplemente no es fácil :) –