簡體   English   中英

Java Regex:將字符串中的信息提取到變量

[英]Java Regex: Extracting info from string to variables

我正在用Java中的regex和以下工作代碼提取字符串的三個部分。 我在正則表達式方面比較新,我覺得使用幾個表達式來進行如此簡單的搜索和提取有點傻。

你們中的任何人都能幫助我找到更優雅,更簡單的解決方案嗎? 我需要將數據存儲在三個單獨的變量中,如代碼所示。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

    public static void main(String[] args) {

        String input = "lat: 56.894205 long: 008.528896 speed: 000.0 24/02/13 21:21   bat:F signal:F  imei:12345678901";

        String lat = regexSearch("(?<=lat: )\\d+.\\d+", input);
        String lng = regexSearch("(?<=long: )\\d+.\\d+", input);
        String imei = regexSearch("(?<=imei:)\\d+", input);

        if (lat != null && lng != null && imei != null) {
            System.out.println(lat);
            System.out.println(lng);
            System.out.println(imei);
        }
    }

    public static String regexSearch(String regex, String input) {
        Matcher m = Pattern.compile(regex).matcher(input);
        if (m.find()) return m.group();
        return null;
    }

}

輸出:

56.894205
008.528896
12345678901

編輯:我需要代碼來處理不同長度的“lat”和“long”數據(例如56.89405和56.894059等)

您可以使用命名捕獲組來分隔匹配組,然后將每個匹配組分配給您選擇的字符串變量。 下面是一個可以用的例子......

String s  = "lat: 56.894205 long: 008.528896 speed: 000.0 24/02/13 21:21   bat:F signal:F  imei:12345678901";
Pattern p = Pattern.compile("lat: (?<lat>\\d+\\.\\d+) long: (?<lng>\\d+\\.\\d+).*imei:(?<imei>\\d+)");
Matcher m = p.matcher(s);
while (m.find()) {
    String lat  = m.group("lat");
    String lng  = m.group("lng");
    String imei = m.group("imei");
    System.out.println(lat);  //=> "56.894205"
    System.out.println(lng);  //=> "008.528896"
    System.out.println(imei); //=> "12345678901"
}

優雅一詞是相對的 ,因人而異。 所以,從我的角度來看,你可以像這樣使用一個正則表達式:

public static void main(String[] args) {
    String input = "lat: 56.894205 long: 008.528896 speed: 000.0 24/02/13 21:21   bat:F signal:F  imei:12345678901";
    Pattern p = Pattern.compile("(\\d+\\.\\d+)(?!\\s\\d+)|(\\d+$)"); // negative lookahead to prevent matching of speed
    Matcher m = p.matcher(input);
    while (m.find()) {
        System.out.println(m.group());
    }

}

O / P:

56.894205
008.528896
12345678901

您可以像這樣簡化代碼:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

    public static void main(String[] args) {

        String input = "lat: 56.894205 long: 008.528896 speed: 000.0 24/02/13 21:21   bat:F signal:F  imei:12345678901";

        Pattern p = Pattern.compile("lat:\\s+(?<latitude>\\d+\\.\\d+)\\s+long:\\s+(?<longitude>\\d+\\.\\d+)\\s+.+?imei:(?<imei>\\d+)");
        Matcher m = p.matcher(input);

        if (m.find()) {
            String lat = m.group("latitude");
            String lng = m.group("longitude");
            String imei = m.group("imei");

            System.out.println(lat);
            System.out.println(lng);
            System.out.println(imei);
        }
    }
}
  • 這里我只使用一個正則表達式來提取數字。 編譯模式可能是一件昂貴的事情。
  • 我正在使用命名捕獲組( (?<latitude> ...)。它使正則表達式讀取更容易。
  • 使用Matcher#group(String name)檢索命名組捕獲的值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM