Как использовать регулярное выражение и присвоить результат переменным в Android? - PullRequest
1 голос
/ 21 мая 2010

У меня есть строка с именем s_Result, которая будет проанализирована из Интернета. Формат может быть "Distance: 2.8km (about 9 mins)", и есть 4 переменные, которые f_Distance, m_DistanceUnit, f_timeEst, m_timeEstUnit.

У меня вопрос, как разобрать s_Result и присвоить 2.8, km, 9, mins в f_Distance, m_distanceUnit, f_timeEst и m_timeEstUnit соответственно с помощью регулярного выражения?

Я пытался использовать "\d+(\.\d+)?" в RegEx Tester, и результат показал 2 найденных совпадения, но если я использую "\\d+(\\.\\d+)?" в коде Android, он не показал совпадений!

Есть предложения, что может пойти не так?

Ответы [ 3 ]

7 голосов
/ 21 мая 2010

Что-то в этом роде?

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
}
0 голосов
/ 21 мая 2010

Это абсолютно так же, как в Java.

Действительно, большинство вопросов по Android связано не с самим Android, а с программированием на Java в целом. Пожалуйста, попробуйте найти более общие вопросы, прежде чем публиковать новые вопросы по Android.

0 голосов
/ 21 мая 2010

Я попытался использовать "\d+(\.\d+)?" в RegEx Tester, и в результате было найдено 2 совпадения, но если я использую "\\d+(\\.\\d+)?" в коде Android, совпадений не было!

Возможно, вы использовали 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
}

Тем не менее, вы думали написать парсер?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...