Как извлечь поплавки из строки и захватить индивидуально в объект? - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть следующий код, и я хотел бы получить 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 () захватил первый float, равный 1.00, и второй matcher.group (), чтобы захватить второй float, который равен 1.04, но все онизахватите 1,00 вместо.Как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Если у вас есть два числа с плавающей точкой в ​​вашей строке, вы можете создать регулярное выражение, которое захватит оба числа с плавающей точкой в ​​две разные группы захвата, как, например, следующее регулярное выражение,

(\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));
}

Prints,

First float: 1.00, Second float: 1.04

Если в вашей строке много чисел с плавающей запятойвам, возможно, придется настроить регулярное выражение для использования .*? вместо .* для захвата ближайших соседних чисел с плавающей запятой или способа, которым вы хотите их захватывать.

Кроме того, скобки в вашем регулярном выражении излишни, если вызаключают в них весь ваш образец.Следовательно, ([0-9]+[.][0-9]+) и [0-9]+[.][0-9]+ почти одинаковы, потому что вам не нужно использовать группы захвата, когда ваша группа захвата точно соответствует целиком.Таким образом, вы можете удалить их, а также, в своем коде вы фактически не использовали захват группы, как я делал в своем коде.Когда вы получаете доступ к совпадению с помощью matcher.group(), он дает вам полное совпадение, а когда вы получаете доступ с использованием matcher.group(1), тогда он дает вам текст, захваченный первой группой, но, как и в вашем случае, и matcher.group(), и matcher.group(1) будут одинаковыми дляпричины, упомянутые выше.

0 голосов
/ 21 февраля 2019

используйте Matcher.find () вместо Matcher.group ()

, как указано в документации,

Попыткичтобы найти следующую подпоследовательность входной последовательности, которая соответствует шаблону.

Я бы предпочел find вместо group на случай, если ваше тело будет содержать более 2 событий в будущем.

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