Как я могу найти только целые числа с регулярным выражением?

Учитывая следующую строку:

11 bsszzz 0.5 te 11.43 432 -66 a x 

Я хочу найти все целые числа. В данном случае: 11, 432 и -66

Какое регулярное выражение я могу использовать для этого?

Я попробовал -?\d+, но он вернет все числа, включая те, которые являются частью десятичных чисел.

Редактировать:

Ни одна из следующих повторяющихся целей не отвечает на вопрос:

  1. Решение в повторяющейся цели Regex to Match only integer дает 11, 432 и 66, что не соответствует требованию.
  2. Решение в повторяющейся цели, Регулярное выражение Python для соответствия целым числам, но не числам с плавающей запятой, также дает тот же результат, то есть 11, 432 и 66.

На самом деле обе повторяющиеся цели дублируют друг друга, но ни одна из них не отвечает требованиям этого вопроса.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
0
594
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать -?\\b(?<!\\.)\\d+(?!\\.)\\b где

  1. -? указывает необязательный -
  2. \b указывает границу слова
  3. ?<! указывает отрицательный просмотр назад, а ?! указывает отрицательный просмотр вперед.

Демо:

import java.util.regex.MatchResult;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
class Main {
    public static void main(String[] args) {
        String str = "11 bsszzz 0.5 te 11.43 432 -66 a x";
        System.out.println(Pattern.compile("-?\\b(?<!\\.)\\d+(?!\\.)\\b")
                .matcher(str)
                .results()
                .map(MatchResult::group)                
                .collect(Collectors.toList()));
    }
}

Выход:

[11, 432, -66]
-?\\b(?<!\\.)\\d+(?!\\.)\\b неверно, он не найдет целое значение 20, скажем, в Nr.20.
Ryszard Czech 12.12.2020 21:53

@RyszardCzech - с регулярным выражением нет проблем, и оно отлично выполняет требование. Значение 20 в Nr.20 не соответствует требованию. Не вводите посетителей в заблуждение негативным комментарием, не задав ОП соответствующий вопрос. И делайте это под вопросом, а не под чьим-то ответом. Под вопросом были комментарии, которых больше нет. Я доверяю модераторам, которые могли удалить их по какой-то причине (чаще всего это конфликт или какие-то враждебные сообщения).

Arvind Kumar Avinash 12.12.2020 22:18

Заголовок: «Как я могу найти только целые числа с помощью регулярного выражения?» - -?\\b(?<!\\.)\\d+(?!\\.)\\b не находит все только целые числа. Смотрите доказательство.

Ryszard Czech 12.12.2020 22:30

@RyszardCzech, в чем смысл вашего комментария, если это регулярное выражение решило мою проблему? Зачем вы добавляете новые условия, которые мне не нужны?

Ross 12.12.2020 22:52

@RyszardCzech Nr.20 можно рассматривать как «Nr.», за которым следует 20, или Nr, за которым следует .20. В последнем случае это явно десятичная дробь. Но, используя вашу логику, выражение не найдет 2213 правильно, потому что на самом деле это 22, за которыми следует 13, что является двумя целыми числами подряд. Поэтому при решении этого вопроса необходимо рассмотреть пример OP.

WJS 13.12.2020 04:07

Другие вопросы по теме