1

这是我拥有的字符串:

KLAS 282356Z 32010KT 10SM FEW090 10/M13 A2997 RMK AO2 SLP145 T01001128 10100 20072 51007

这是一份天气报告。我需要从报告中提取以下数字:10/M13. 它是温度和露点,M表示负值。因此,字符串中的位置可能会有所不同,并且温度可能会显示为M10/M1310/13M10/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。我尝试了数十种变化,但无济于事。如果有人可以提供帮助,非常感谢!

4

4 回答 4

1

这将提取您寻找的字符串,它只有一行代码:

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
于 2013-01-29T01:20:59.760 回答
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

于 2013-01-29T01:18:17.353 回答
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);
    }
于 2013-01-29T01:24:03.297 回答
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);

更漂亮的替代品,正如 Adrian 所指出的:

String result = rawString.split(" ")[5];

请注意,拆分实际接收正则表达式模式作为参数

于 2013-01-29T01:24:06.207 回答