La búsqueda de número después de una palabra específica que no precede inmediatamente al número de

Thomas Walker:

Estoy tratando de utilizar un patrón para buscar un código postal dentro de una cadena. No puedo conseguir que funcione correctamente.

Una muestra de la inputLine es

What is the weather in 75042?

Lo que estoy tratando de usar para un patrón es

public String getZipcode(String inputLine) {

        Pattern pattern = Pattern.compile(".*weather.*([0-9]+).*");
        Matcher matcher = pattern.matcher(inputLine);

        if (matcher.find()) {

            return matcher.group(1).toString();
        }

        return "Zipcode Not Found.";

    }

Si estoy buscando sólo para obtener 75002, ¿qué necesito a cambio? Esto sólo produce la salida del último dígito del número, 2. Estoy terriblemente confuso y no entiendo por completo las Javadocs para la clase del patrón.

Wiktor Stribiżav:

Su .*weather.*([0-9]+).*patrón agarra toda la línea con la primera .*y la preclasificación de encontrar weather, y si lo encuentra, se agarra la parte de la línea después de las palabras a final de línea con la posterior .*patrón y la preclasificación de nuevo para encontrar el último dígito y el único dígitos se almacena en grupo de captura 1 desde uno satisface dígitos el [0-9]+patrón. El último .*solo consume la línea hasta el final.

Es posible resolver el problema sólo por el uso ".*weather.*?([0-9]+).*"(haciendo la segunda .*perezoso), pero dado que está utilizando Matcher#find(), puede utilizar una expresión regular más sencilla:

Pattern pattern = Pattern.compile("weather\\D*(\\d+)");

Y después de conseguir un partido, recuperar el valor con matcher.group(1).

Vea la demostración de expresiones regulares .

detalles del patrón

  • weather- una weatherpalabra
  • \\D* - 0+ caracteres que no sean dígitos
  • (\\d+) uno o más dígitos: - Grupo 1 Captura

Vea la demostración de Java :

String inputLine = "What is the weather in 75042?";
Pattern pattern = Pattern.compile("weather\\D*(\\d+)");
Matcher matcher = pattern.matcher(inputLine);

if (matcher.find()) {
    System.out.println(matcher.group(1)); // => 75042
}

Supongo que te gusta

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