Как извлечь числа из строки и получить массив 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++"); 
  • Как правильно сравнить строки?
  • Записывать особые символы в строке
  • Самый эффективный способ удаления специальных символов из строки
  • Как удалить одиночный символ из строки
  • Хорошо ли использовать java.lang.String.intern ()?
  • C #: class для декодирования кодировки с кодовым кодированием?
  • Чтение файла по строке в C #
  • Как интерполировать переменные в строках в JavaScript, без конкатенации?
  • Как динамически распределять пространство памяти для строки и получать эту строку от пользователя?
  • Что именно делает метод .join ()?
  • Строковый вывод: формат или concat в C #?
  • Interesting Posts

    Перенаправление в другой домен, но сохранить введенный домен

    Как отсортировать процессы по времени?

    Не удалось добавить объекты в NSMutableArray в Objective C

    Как изменить быстрые клавиши Windows 10?

    Перемещение всех файлов вложенных папок в другую папку

    Разница между parseInt и valueOf в java?

    Как повторно включить backspace-навигацию в Chrome?

    Можно ли восстановить закрытые вкладки после выхода из Chrome?

    Кто-нибудь знает хороший способ обхода нехватки enum generic constraint?

    Crontab – / bin / sh: wget: команда не найдена

    Почему я получаю символ глаза на своих почтовых учетных записях в полях пароля в Internet Explorer?

    Как работают servlets? Создание, сеансы, общие переменные и multithreading

    Не удается завершить установку kali linux без cd или usb, но я не использую ни

    Передача строки из одного действия в другую активность на Android

    Эмулирование правой клавиши Ctrl на клавиатуре MacBook Pro без фактической правой клавиши Ctrl

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