Использование Regex Pattern и Matcher для распечатки номера только один раз - PullRequest
0 голосов
/ 12 февраля 2020

Этот фрагмент кода является частью моей программы, и я пытаюсь распечатать последнее целое значение строки только тогда, когда оператор и знак равенства находятся вместе (например, ^ =, * =, et c.) .

Следовательно, если я введу 4 4 ^ 4 ^ 4 ^=, я бы хотел вывести только «4». То же самое считается, если число 4 находится непосредственно перед «^ =», например, 4 4 ^ 4 ^ 4 ^ =.

Мой код такой:

if ((input.endsWith("^=")) | (input.endsWith("*=")) |
    (input.endsWith("+=")) | (input.endsWith("-=")) |
    (input.endsWith("%=")) | (input.endsWith("/=")))
{
    Pattern p = Pattern.compile("[^\\d]*[\\d]+[^\\d]+([\\d]+)");
    Matcher m = p.matcher(input);
    if (m.find()) {
        System.out.println(m.group(1)); // second matched digits
    }
}

В настоящее время мой код печатает число 4 несколько раз, но я бы хотел напечатать его только один раз. Любая помощь это ценить.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 12 февраля 2020

Попробуйте

(\d+)\s*[-+*/^%]=$
  • Найдите 1 или более цифр и запишите их
  • , если за ними следуют 0 или более пробелов
  • , за которыми следует -, +, *, /, ^ или%
  • с последующим =
  • с последующим концом строки
0 голосов
/ 12 февраля 2020

Вы можете использовать:

([0-9]+)\h*[\^+%/*-]=(?!.*[\^+%/*-]=)
  • ([0-9]+) Захват 1+ цифр 0-9 в группе 1
  • \h* Соответствие 0+ горизонтальных пробелов
  • [\^+%/*-]= Совпадение с любым из перечисленных, за которым следует =
  • (?!.*[\^+%/*-]=) Отрицательный прогноз, утверждающий, что справа нет оператора, за которым следует знак равенства

Regex demo | Java демо

In Java

final String regex = "([0-9]+)\\h*[\\^+%/*-]=(?!.*[\\^+%/*-]=)";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...