Разобрать строку в Java - PullRequest
       4

Разобрать строку в Java

2 голосов
/ 06 ноября 2011

У меня есть строки, отформатированные аналогично приведенной ниже в Java-программе.Мне нужно получить номер.

Host is up (0.0020s latency).

Мне нужно число между символами '(' и 's'. Например, в этом примере мне понадобится 0.0020 .

Ответы [ 6 ]

3 голосов
/ 06 ноября 2011

Если вы уверены, что это всегда будет первое число, которое вы можете использовать для регулярного выражения \d+\.\d+ (но учтите, что обратные слеши необходимо экранировать в строковых литералах Java).

Попробуйте этот код:

String input = "Host is up (0.0020s latency).";
Pattern pattern = Pattern.compile("\\d+\\.\\d+");
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
    System.out.println(matcher.group());
}

Смотрите, как он работает в режиме онлайн: ideone

Вы также можете включить некоторые регулярные выражения в регулярное выражение, чтобы уменьшить риск совпадения с неправильным числом.Чтобы сделать именно так, как вы просили в вопросе (например, соответствие между ( и s), используйте это регулярное выражение:

\((\d+\.\d+)s

Смотрите, как он работает в режиме онлайн: ideone

3 голосов
/ 06 ноября 2011

Звучит как случай для регулярных выражений.

Вы хотите найти десятичную цифру, а затем проанализировать ее:

Float matchedValue;
Pattern pattern = Pattern.compile("\\d*\\.\\d+");
Matcher matcher = pattern.matcher(yourString);
boolean isfound = matcher.find();

if (isfound) {
    matchedValue = Float.valueOf(matcher.group(0));
}
2 голосов
/ 06 ноября 2011

Зависит от того, насколько «похожим» ты имеешь в виду. Вы можете использовать регулярное выражение:

import java.math.BigDecimal;
import java.util.regex.*;

public class Test {
    public static void main(String args[]) throws Exception {
        Pattern pattern = Pattern.compile("[^(]*\\(([0-9]*\\.[0-9]*)s");        
        String text = "Host is up (0.0020s latency).";

        Matcher match = pattern.matcher(text);
        if (match.lookingAt())
        {
            String group = match.group(1);
            System.out.println("Before parsing: " + group);
            BigDecimal value = new BigDecimal(group);
            System.out.println("Parsed: " + value);
        }
        else
        {
            System.out.println("No match");
        }
    }
}

Конечно, насколько конкретно вы хотите сделать свой шаблон, зависит от вас. Это проверяет только цифры, точку, затем цифры после открывающей скобки и перед s. Возможно, вам придется уточнить его, чтобы сделать точку необязательной и т. Д.

1 голос
/ 06 ноября 2011

Это отличный сайт для создания регулярных выражений от простых до очень сложных. Вы выбираете язык и бум.

http://txt2re.com/

0 голосов
/ 06 ноября 2011

Конечно, использование регулярных выражений в этом случае является лучшим решением, но во многих простых случаях вы можете использовать что-то вроде:

String value = myString.subString(myString.indexOf("("), myString.lastIndexOf("s")) double numericValue = Double.parseDouble (значение);

Это не рекомендуется, поскольку текст в myString может измениться.

0 голосов
/ 06 ноября 2011

Вот способ без регулярных выражений

    String str = "Host is up (0.0020s latency).";
    str = str.substring(str.indexOf('(')+1, str.indexOf("s l"));
    System.out.println(str);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...