我有一个名为s_Result
的字符串,它将从Internet解析。格式可以是"Distance: 2.8km (about 9 mins)"
,有4个变量f_Distance
,m_DistanceUnit
,f_timeEst
,m_timeEstUnit
。
我的问题是如何解析s_Result
并将2.8
,km
,9
,mins
分配到f_Distance
,{{1} },m_distanceUnit
和f_timeEst
分别使用正则表达式?
我尝试在RegEx Tester中使用m_timeEstUnit
,结果显示找到了2个匹配项,但如果我在Android代码中使用"\d+(\.\d+)?"
,则表示没有匹配!
任何可能出错的建议?
答案 0 :(得分:6)
那样的东西?
String s_Result="Distance: 2.8km (about 9 mins)";
//Distance parsing
Pattern p = Pattern.compile("Distance: (\\d+(\\.\\d+)?)(.*?)\\b");
Matcher m = p.matcher(s_Result);
if(m.find()){
MatchResult mr=m.toMatchResult();
f_Distance=mr.group(1);//2.8
m_DistanceUnit=mr.group(3);//km
}
//Time parsing
p = Pattern.compile("about (\\d+(\\.\\d+)?) (.*)\\b");
m = p.matcher(s_Result);
if(m.find()){
MatchResult mr=m.toMatchResult();
f_timeEst=mr.group(1);//9
m_timeEstUnit=mr.group(3);//min
}
这里有另一个选项,可以匹配更灵活的格式:
String s_Result="Distance: 2.8km (about 9 mins)";
Pattern p = Pattern.compile("(\\d+(\\.\\d+)?) ?(\\w+?)\\b");
Matcher m = p.matcher(s_Result);
while(m.find()){
MatchResult mr=m.toMatchResult();
String value=mr.group(1);//2.8 and 9 come here
String units=mr.group(3);//km and mins come here
}
答案 1 :(得分:0)
我尝试在RegEx Tester中使用
"\d+(\.\d+)?"
,结果显示找到了2个匹配项,但如果我在Android代码中使用"\\d+(\\.\\d+)?"
,则表示没有匹配!
可能您使用的是String#matches()
或Matcher#matches()
,它们会匹配整个字符串。那么正则表达式实际上是"^\\d+(\\.\\d+)?$"
。更好地使用Matcher#find()
。
String s = "Distance: 2.8km (about 9 mins)";
Matcher m = Pattern.compile("\\d+(\\.\\d+)?").matcher(s);
while (m.find()) {
System.out.println(m.group(0)); // 2.8 and 9
}
那就是说,你考虑过写一个解析器吗?
答案 2 :(得分:0)
这与Java完全相同。
实际上,大多数Android问题与Android本身无关,而是与Java编程有关。在发布新的“Android”问题之前,请尝试搜索更多一般性问题。