Java正则表达式匹配问题:无法匹配指定气象数据文本
Java正则匹配气象数据无输出问题解决指南
我之前也踩过正则匹配这类结构化文本的坑,没输出的时候真的抓耳挠腮!咱们来一步步搞定这个问题。
首先,先看看你的待匹配文本结构:
Temperature: 9°C (48°F), Wind Direction: South South Westerly, Wind Speed: 19mph, Humidity: 87%, Pressure: 1018mb, Rising, Visibility: Good
这是典型的「键: 值」格式,不过有些键是多单词(比如Wind Direction),有些值包含特殊字符甚至内嵌逗号(比如Pressure的值是1018mb, Rising),这些都是容易踩的坑。
常见错误原因
你写的正则没输出,大概率是这几个问题:
- 错误使用
matches()方法:这个方法会强制匹配整个字符串,如果你的正则只对应单个数据项,肯定返回false,应该用find()循环查找所有子匹配。 - 正则没处理多单词键:比如
Wind Direction是两个单词,只写\w+只能匹配第一个单词,漏掉后面的部分。 - 正则提前截断了值:比如用
[^,]+匹配值时,遇到Pressure里的逗号就停了,会漏掉Rising;或者没考虑冒号后的空格,导致匹配失败。
正确的正则与代码示例
下面是能完美匹配所有数据项的代码,我会一步步解释:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class WeatherMatcher { public static void main(String[] args) { String weatherText = "Temperature: 9°C (48°F), Wind Direction: South South Westerly, Wind Speed: 19mph, Humidity: 87%, Pressure: 1018mb, Rising, Visibility: Good"; // 正则表达式:捕获键和对应的值,处理多单词键、内嵌逗号的值 String regex = "(\\w+(?:\\s+\\w+)*):\\s+(.+?)(?=\\s*, \\w+|$)"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(weatherText); // 循环查找所有匹配项 while (matcher.find()) { String key = matcher.group(1).trim(); String value = matcher.group(2).trim(); System.out.printf("%s: %s%n", key, value); } } }
正则解释
(\w+(?:\s+\w+)*):捕获多单词键,比如Temperature、Wind Direction。(?:\s+\w+)*是非捕获组,用来匹配键后面的「空格+单词」组合,重复0次或多次。:\s+:匹配冒号和后面的一个或多个空格,确保不会因为空格漏掉匹配。(.+?):非贪婪匹配任意字符,避免过度匹配。(?=\s*, \w+|$):正向预查,用来判断值的结束位置——要么是「空格+逗号+空格+单词」(下一个键的开头),要么是字符串结尾,这样就能正确捕获Pressure里的1018mb, Rising。
运行结果
执行这段代码后,你会得到清晰的输出:
Temperature: 9°C (48°F) Wind Direction: South South Westerly Wind Speed: 19mph Humidity: 87% Pressure: 1018mb, Rising Visibility: Good
内容的提问来源于stack exchange,提问作者Dragma
相关产品推荐
相关产品推荐

