这是我的字符串:
KLAS 282356Z 32010KT 10SM FEW090 10/M13 A2997 RMK AO2 SLP145 T01001128 10100 20072 51007
这是天气预报。我需要从报告中提取以下数字:10/M13
。它是温度和露点,M
表示减去。因此,字符串中的位置可能不同,温度可能会显示为M10/M13
或10/13
或M10/13
。
我已完成以下代码:
public String getTemperature (String metarIn){
Pattern regex = Pattern.compile(".*(\\d+)\\D+(\\d+)");
Matcher matcher = regex.matcher(metarIn);
if (matcher.matches() && matcher.groupCount() == 1) {
temperature = matcher.group(1);
System.out.println(temperature);
}
return temperature;
}
显然,正则表达式是错误的,因为该方法总是返回null。我尝试了几十种变化但无济于事。非常感谢有人可以提供帮助!
答案 0 :(得分:1)
这将提取您寻找的String,它只有一行代码:
String tempAndDP = input.replaceAll(".*(?<![M\\d])(M?\\d+/M?\\d+).*", "$1");
这是一些测试代码:
public static void main(String[] args) throws Exception {
String input = "KLAS 282356Z 32010KT 10SM FEW090 M01/M13 A2997 RMK AO2 SLP145 T01001128 10100 20072 51007";
String tempAndDP = input.replaceAll(".*(?<![M\\d])(M?\\d+/M?\\d+).*", "$1");
System.out.println(tempAndDP);
}
输出:
M01/M13
答案 1 :(得分:0)
正则表达式应如下所示:
M?\d+/M?\d+
对于Java,这将看起来像:
"M?\\d+/M?\\d+"
您可能需要在正面和结尾添加空格检查:
"\\sM?\\d+/M?\\d+\\s"
但这取决于你认为你将在哪里找到模式,因为如果它在字符串的末尾就不会匹配,所以我们应该使用:
"(^|\\s)M?\\d+/M?\\d+($|\\s)"
这指定如果在结尾或前面没有任何空格,我们必须匹配字符串的结尾或字符串的开头。
用于测试的示例代码:
Pattern p = Pattern.compile("(^|\\s)M?\\d+/M?\\d+($|\\s)");
String test = "gibberish M130/13 here";
Matcher m = p.matcher(test);
if (m.find())
System.out.println(m.group().trim());
返回:M130/13
答案 2 :(得分:0)
尝试:
Pattern regex = Pattern.compile(".*\\sM?(\\d+)/M?(\\d+)\\s.*");
Matcher matcher = regex.matcher(metarIn);
if (matcher.matches() && matcher.groupCount() == 2) {
temperature = matcher.group(1);
System.out.println(temperature);
}
答案 3 :(得分:0)
正则表达式的替代方案。
有时候正则表达式不是唯一的解决方案。看来在你的情况下,你必须获得第6块文本。每个块由空格字符分隔。所以,你需要做的就是计算块数。
考虑到每个文本块没有固定长度
示例:
String s = "KLAS 282356Z 32010KT 10SM FEW090 10/M13 A2997 RMK AO2 SLP145 T01001128 10100 20072 51007";
int spaces = 5;
int begin = 0;
while(spaces-- > 0){
begin = s.indexOf(' ', begin)+1;
}
int end = s.indexOf(' ', begin+1);
String result = s.substring(begin, end);
System.out.println(result);
考虑到每个文本块都有固定长度
String s = "KLAS 282356Z 32010KT 10SM FEW090 10/M13 A2997 RMK AO2 SLP145 T01001128 10100 20072 51007";
String result = s.substring(33, s.indexOf(' ', 33));
System.out.println(result);
更漂亮的替代,正如阿德里安指出的那样:
String result = rawString.split(" ")[5];
请注意,split acctualy会将正则表达式模式作为参数