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.
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
- unaweather
palabra\\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
}