如何从字符串中提取浮点数并分别捕获到对象中?

时间:2019-02-21 10:56:34

标签: java android regex

我有以下代码,我想获取1.00和1.04并在一个对象中声明它。但是我遇到了问题,请帮忙。这是我的代码

String body = "You have bought USD 1.00 Whatsapp for 784024487. Your new wallet balance is USD 1.04. Happy Birthday EcoCash for turning 7years. Live Life the EcoCash Way.";
String regex="([0-9]+[.][0-9]+)";
Pattern pattern=Pattern.compile(regex);
Matcher matcher=pattern.matcher(body);
while(matcher.find())
        {
            String detail = "Airtime";
            transUtilsList.add(new TransUtils(detail,+matcher.group(),matcher.group()));
        }

我希望第一个matcher.group()捕获第一个浮点数为1.00,第二个matcher.group()捕获第二个浮点数为1.04,但它们都捕获了1.00。我该怎么办?

2 个答案:

答案 0 :(得分:0)

使用Matcher.find()代替Matcher.group()

如文档中所述,

  

尝试查找与模式匹配的输入序列的下一个子序列。

以防find胜过group,以防将来您的身体中出现2次以上。

答案 1 :(得分:0)

如果字符串中有两个浮点数,则可以创建一个正则表达式,将两个浮点数捕获到两个不同的捕获组中,例如以下正则表达式,

(\d+\.\d+).*(\d+\.\d+)

然后使用matcher.group(1)matcher.group(2)

访问两个匹配项

检查修改后的Java代码,

String body = "You have bought USD 1.00 Whatsapp for 784024487. Your new wallet balance is USD 1.04. Happy Birthday EcoCash for turning 7years. Live Life the EcoCash Way.";
String regex = "(\\d+\\.\\d+).*(\\d+\\.\\d+)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(body);
while (matcher.find()) {
    System.out.println("First float: " + matcher.group(1) + ", Second float: " + matcher.group(2));
}

打印

First float: 1.00, Second float: 1.04

如果字符串中有许多浮点数,则可能需要调整正则表达式以使用.*?而不是.*来捕获紧邻的浮点数或捕获它们的方式。

此外,如果将整个模式包含在正则表达式中,则括号是多余的。因此,([0-9]+[.][0-9]+)[0-9]+[.][0-9]+几乎相同,因为当捕获组完全匹配时,您无需使用捕获组。因此,您可以删除它们,并且,在您的代码中,您实际上并没有像我在代码中那样使用组捕获。当您使用matcher.group()访问匹配项时,它会为您提供完全匹配,而当您使用matcher.group(1)访问匹配项时,则会为您提供第一个组捕获的文本,但与您的情况一样,matcher.group()和{ {1}}出于上述原因将是相同的。