¿Cómo puedo análisis sintáctico humana formato escrito y tablas de texto con una gran cantidad de variación en Java, y si la respuesta es expresión regular cómo obtener correctamente los valores de fila?

user8402764:

Tengo que analizar una entrada de usuario extremadamente variado. Un ejemplo podría ser:

Example 1:
March
    Morning     Evening
    (Avg Count) (Avg Count)
Birds    5.6          10.35
Mammals  2.0          3.3


Example 2:
March
    Morning   Afternoon Evening
     (Num)     (Num)     (Num)
Birds    5.6       9        10
Mammals  2.0       2.5      3.3
Reptiles 1.0       5.6      1.75

Status Avg Total: Birds 24
Concerning that numbers have dwindled since last year

Example 3:
    Early     Mid       Late 
    (Count)   (Count)   (Count)
Mammal   2.0       2.5      3.3  (Count)
Reptile 1.0    5.6      1.75  (Count)

Lo ideal sería que la entrada del usuario sería normal, pero eso no va a ocurrir ahora. En lugar de eso, lo que sería la mejor manera de analizar la entrada de usuario?

Mi estrategia actual está utilizando Java del patrón matcher clases. Estoy usando matcher.matchers () para comprobar si el formato de la cabecera es un formato posible. Sobre la base de que envío el texto a un método que utiliza matcher.find () para obtener los grupos de captura de la fila. Sería sacar el nombre de la fila (ex. Mamífero) y los valores decir 2.0 y 3.3 del primer ejemplo de texto. Sin embargo, la entrada del usuario es tan variada, que este método es muy fastidioso.

Por ejemplo, I inicialmente estaba sacando las aves 24 del ejemplo 2 como un grupo de captura, ya que en el texto que contiene un formato similar al de la columna. Así que lo cambié para no permitir que cualquier texto, pero el nombre de la fila en la línea. Sin embargo, ahora no puede sacar filas como ejemplo 3 con (Conde) al lado de él.

Así que mi enfoque actual es, comprobar el formato de cabecera usando expresiones regulares. Si un formato, extraiga el nombre y los valores fila. Incluso con esa estrategia, estoy teniendo problemas para encontrar la expresión regular derecho a obtener la fila fila y valores propios.

Mi expresión regular actual para matcher.find () es la siguiente:

(Mammal|Reptile|Bird|Mammals|Reptiles|Birds)(^a-zA-Z-]*?[0-9])\r\n|[\r\n]

Donde el grupo de captura de 1 sería el nombre de la fila y el grupo 2 debe ser los números

Así que tengo dos preguntas:

¿Hay una mejor manera de abordar este problema?

Si no hay una mejor manera, lo que sería la expresión de expresiones regulares derecho a sacar la fila y es valores?

El cuarto de aves:

Se podría utilizar 2 grupos de captura en el que el primero contiene el nombre de la fila como aves y un partido repetido para el grupo 2 que contiene los números usando el \Gancla.

Tenga en cuenta que usted podría agregar una opcionales s utilizando s?para que coincida con los Mamíferos o mamíferos, etc.

(?:^(Mammals?|Reptiles?|Birds?)|\G(?!^))\h+(\d+(?:\.\d+)?)
  • (?: grupo sin captura
    • ^ Afirman inicio de la cadena
    • (Mammals?|Reptiles?|Birds?)Captura el grupo 1 coincide con ninguna opción
    • | O
    • \G(?!^) Afirmar la posición al final del partido anterior
  • ) Cerrar grupo sin captura
  • \h+ 1+ coincidir con el espacio en blanco horizontal caracteres
  • (Captura el grupo 2
    • \d+(?:\.\d+)? Coincidir 1+ dígitos y una parte opcional para que coincida con los decimales
  • ) Cerrar el grupo 2

Demostración de expresiones regulares | demostración de Java

en Java

final String regex = "(?:^(Mammals?|Reptiles?|Birds?)|\\G(?!^))\\h+(\\d+(?:\\.\\d+)?)";

Nota que en vez de utilizar \d+(?:\.\d+)?para que coincida con los dígitos, puede ser que usted podría utilizar \S+para crear una amplia coincidencia de partido 1+ veces a la carbonilla no espacios en blanco.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=312611&siteId=1
Recomendado
Clasificación