Как извлечь числа из строки и получить массив ints?

У меня есть переменная String (в основном английское предложение с неуказанным числом чисел), и я хотел бы извлечь все числа в массив целых чисел. Мне было интересно, было ли быстрое решение с регулярными выражениями?


Я использовал решение Шона и немного изменил его:

LinkedList numbers = new LinkedList(); Pattern p = Pattern.compile("\\d+"); Matcher m = p.matcher(line); while (m.find()) { numbers.add(m.group()); } 

9 Solutions collect form web for “Как извлечь числа из строки и получить массив ints?”

 Pattern p = Pattern.compile("-?\\d+"); Matcher m = p.matcher("There are more than -2 and less than 12 numbers here"); while (m.find()) { System.out.println(m.group()); } 

… печатает -2 и 12 .


-? соответствует ведущему отрицательному знаку – необязательно. \ d соответствует цифре, и мы должны писать \ as \\ в Java String. Итак, \ d + соответствует 1 или более цифрам.

Как использовать метод replaceAll java.lang.String:

  String str = "qwerty-1qwerty-2 455 f0gfg 4"; str = str.replaceAll("[^-?0-9]+", " "); System.out.println(Arrays.asList(str.trim().split(" "))); 

Вывод:

 [-1, -2, 455, 0, 4] 

Описание

 [^-?0-9]+ 
  • + Между одним и неограниченным временем, столько раз, сколько возможно, отдавая при необходимости
  • -? Один из персонажей «-?»
  • 0-9 в диапазоне от «0» до «9»
 Pattern p = Pattern.compile("[0-9]+"); Matcher m = p.matcher(myString); while (m.find()) { int n = Integer.parseInt(m.group()); // append n to list } // convert list to array, etc 

Фактически вы можете заменить [0-9] на \ d, но это связано с двойным обратным слэшем, что затрудняет чтение.

  StringBuffer sBuffer = new StringBuffer(); Pattern p = Pattern.compile("[0-9]+.[0-9]*|[0-9]*.[0-9]+|[0-9]+"); Matcher m = p.matcher(str); while (m.find()) { sBuffer.append(m.group()); } return sBuffer.toString(); 

Это для извлечения чисел, сохраняющих десятичную

для рациональных чисел используйте это: (([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))

Принятый ответ обнаруживает цифры, но не обнаруживает сформированные числа, например 2000, а не десятичные числа, например 4.8. Для такого использования -?\\d+(,\\d+)*?\\.?\\d+? :

  Pattern p = Pattern.compile("-?\\d+(,\\d+)*?\\.?\\d+?"); List numbers = new ArrayList(); Matcher m = p.matcher("Government has distributed 4.8 million textbooks to 2,000 schools"); while (m.find()) { numbers.add(m.group()); } System.out.println(numbers); 

Выход: [4.8, 2,000]

Используя Java 8, вы можете:

 String str = "There 0 are 1 some -2-34 -numbers 567 here 890 ."; int[] ints = Arrays.stream(str.replaceAll("-", " -").split("[^-\\d]+")) .filter(s -> !s.matches("-?")) .mapToInt(Integer::parseInt).toArray(); System.out.println(Arrays.toString(ints)); // prints [0, 1, -2, -34, 567, 890] 

Если у вас нет отрицательных чисел, вы можете избавиться от replaceAll (и использовать !s.isEmpty() в filter ), так как это только для того, чтобы правильно разделить что-то вроде 2-34 (это также можно обрабатывать только с регулярным выражением в split , но это довольно сложно).

Arrays.stream превращает нашу String[] в Stream .

filter избавляется от начальных и конечных пустых строк, а также от любого, что не является частью числа.

mapToInt(Integer::parseInt).toArray() вызывает parseInt для каждой String чтобы дать нам int[] .


В качестве альтернативы Java 9 имеет метод Matcher.results , который должен допускать что-то вроде:

 Pattern p = Pattern.compile("-?\\d+"); Matcher m = p.matcher("There 0 are 1 some -2-34 -numbers 567 here 890 ."); int[] ints = m.results().map(MatchResults::group).mapToInt(Integer::parseInt).toArray(); System.out.println(Arrays.toString(ints)); // prints [0, 1, -2, -34, 567, 890] 

Как бы то ни было, ни одно из них не является большим улучшением по сравнению с простое вычисление результатов с помощью Pattern / Matcher как показано в других ответах, но это должно быть проще, если вы хотите следовать этому с более сложными операциями, которые значительно упрощаются с помощью использование streamов.

Я бы предложил проверить значения ASCII для извлечения чисел из String. Предположим, что у вас есть входной String как myname12345, и если вы хотите просто извлечь номера 12345, вы можете сделать это, сначала преобразуя строку в Character Array, а затем используйте следующий psuedocode

 for(int i=0;i=48&&a[i]< =58) System.out.print(a[i]); } 

как только числа будут извлечены, добавьте их в массив

Надеюсь это поможет

Я нашел это выражение простым

 String[] extractednums = msg.split("\\\\D++"); 
  • Что такое @ перед строкой в ​​C #?
  • Простой способ повторить строку в java
  • Как объединить две строки в C?
  • Как заменить несколько пробелов на одно место в C #?
  • Как подсчитать количество вхождений символа в String?
  • Преобразование строки в строковый массив в java
  • C # Разделение строк?
  • Java String.equals против ==
  • Ссылка на одну строку из другой строки в strings.xml?
  • Как динамически распределять пространство памяти для строки и получать эту строку от пользователя?
  • Цитирование обратных косых черт в строковых литералах Python
  • Interesting Posts

    Что такое C-указатель, если не адрес памяти?

    Обновления, нарушающие Windows Embedded Standard 7 в DISM

    Подключение к точке доступа Wi-Fi с помощью определенного MAC-адреса

    Как я могу использовать jQuery в сценариях Greasemonkey в Google Chrome?

    Блокировка приложения YouTube на YouTube с маршрутизатора

    Почему вы не видите двоичный код при открытии двоичного файла с текстовым редактором?

    Параметры объединения пула с JDBC: DBCP vs C3P0

    Что такое эллипсис (…) для этой сигнатуры метода?

    Вычисление разницы во времени между двумя датами / временами из двух столбцов в Excel

    Точно вырезать видео файлы из командной строки

    Поддомены, порты и протоколы подстановки под контролем доступа-Разрешения-Origin

    Свойства системы Java и переменные среды

    Как отобразить выбранный элемент в раскрывающемся списке кнопки Bootstrap

    $ {employee.id} из списка в JSP throws java.lang.NumberFormatException: для строки ввода: “id”

    Windows 7 аналоговые часы секундная стрелка не отображается

    Давайте будем гением компьютера.