2011-02-04 24 views
6

Estoy trabajando en una aplicación que calculará el peso molecular y tengo que separar una cadena en las diferentes moléculas. He estado usando una expresión regular para hacer esto, pero aún no he conseguido que funcione. necesito la expresión regular para que coincida en patrones como H2OCl4 y Na2H2O donde sería dividirla en partidos como:Regex para que coincida con mayúscula, dígito o mayúscula, minúscula y dígito

  1. H2
  2. O
  3. Cl4

  1. Na2
  2. H2
  3. O

La expresión regular que he estado trabajando en es la siguiente:

([A-Z]\d*|[A-Z]*[a-z]\d*) 

Está muy cerca pero actualmente rompe los fósforos en esto:

  1. H2
  2. O
  3. C
  4. l4

Necesito que el Cl4 se considere una coincidencia. ¿Alguien puede ayudarme con la última parte que me falta en esto? Soy bastante nuevo en expresiones regulares. Gracias.

Respuesta

9

Creo que lo que quiere es "[A-Z][a-z]?\d*"

Es decir, una letra mayúscula, seguida de una pequeña carta opcional, seguido de una cadena opcional de dígitos.

Si desea hacer coincidir 0, 1, o 2 letras minúsculas, a continuación, se puede escribir:

"[A-Z][a-z]{0,2}\d*"

Nótese, sin embargo, que estas dos expresiones regulares asumen que los datos de entrada es válido. Dada la mala información, omitirá los datos incorrectos. Por ejemplo, si la cadena de entrada es "H2ClxxzSO4", que va a obtener:

  1. H2
  2. Clx
  3. S
  4. O4

Si desea detectar mal datos, deberá verificar la propiedad Index del objeto devuelto Match para asegurarse de que sea igual al índice inicial.

+0

Sí que parece que funciona. Gracias. –

+2

Para completar, probablemente desee dos letras pequeñas opcionales, para manejar los elementos 113 a 118, que todavía se denominan Ununtrium (símbolo Uut) y similares. –

+1

Batirme a eso. :) – UnkwnTech

Cuestiones relacionadas