1

これは私が持っている文字列です:

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を返すため、明らかに正規表現は間違っています。私は何十ものバリエーションを試しましたが、役に立ちませんでした。誰かが助けてくれたらどうもありがとう!

4

4 に答える 4

1

これにより、求める文字列が抽出されます。コードは 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);

エイドリアンが指摘したように、より良い代替案:

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

split は実際に正規表現パターンをパラメーターとして受け取ることに注意してください

于 2013-01-29T01:24:06.207 に答える