Java:使用Pattern和Matcher查找特定模式

时间:2013-01-29 01:08:14

标签: java regex

这是我的字符串:

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 个答案:

答案 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会将正则表达式模式作为参数