我用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
编辑: 我需要代码来处理不同长度的&#34; lat&#34;和&#34;长&#34;数据(例如56.89405和56.894059等)
答案 0 :(得分:2)
您可以使用Named Capturing Groups分隔匹配组,然后将每个匹配组分配给您选择的字符串变量。下面是一个可以解决的工作示例...
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"
}
答案 1 :(得分:0)
优雅一词是 relative ,因人而异。所以,从我的角度来看,你可以像这样使用一个正则表达式:
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
答案 2 :(得分:0)
您可以像这样简化代码:
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)