У меня есть строковая переменная (в основном английское предложение с неопределенным количеством чисел), и я хотел бы извлечь все числа в массив целых чисел. Мне было интересно, есть ли быстрое решение с регулярными выражениями?
Я использовал решение Шона и немного изменил его:
LinkedList<String> numbers = new LinkedList<String>();
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(line);
while (m.find()) {
numbers.add(m.group());
}
Ответы:
... печатает
-2
и12
.-? соответствует ведущему отрицательному знаку - необязательно. \ d соответствует цифре, и нам нужно писать
\
как\\
в строке Java. Итак, \ d + соответствует 1 или более цифрам.источник
2,000
. За такое использование-?\\d+,?\\d+|-?\\d+
-?\\d+(,\\d{3})*
должно работать.Как насчет использования
replaceAll
метода java.lang.String:Вывод:
Описание
[
и]
ограничивает набор символов, которые должны быть сопоставлены по одному, то есть только один раз в любом порядке^
Специальный идентификатор, используемый в начале набора, используется для указания соответствия всем символам, отсутствующим в наборе с разделителями, вместо всех символов, присутствующих в наборе.+
От одного до неограниченного количества раз, столько раз, сколько возможно, возвращая по мере необходимости-?
Один из символов «-» и «?»0-9
Символ в диапазоне от «0» до «9».источник
-
сам по себе , как число, наряду с вещами , как9-
,---6
, и1-2-3
.Фактически вы можете заменить [0-9] на \ d, но это требует экранирования двойной обратной косой черты, что затрудняет чтение.
источник
Это для извлечения чисел, сохраняющих десятичную дробь.
источник
Принятый ответ обнаруживает цифры, но не определяет ни форматированные числа, например, 2000, ни десятичные дроби, например 4.8. Для такого использования
-?\\d+(,\\d+)*?\\.?\\d+?
:Вывод:
[4.8, 2,000]
источник
(?:\.\d+)?
.)для рациональных чисел используйте это:
(([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))
источник
Используя Java 8, вы можете:
Если у вас нет отрицательных чисел, вы можете избавиться от
replaceAll
(и использовать!s.isEmpty()
infilter
), поскольку это только для правильного разделения чего-то вроде2-34
(это также можно обработать чисто с помощью регулярного выраженияsplit
, но это довольно сложно).Arrays.stream
превращает нашString[]
вStream<String>
.filter
избавляется от начальных и конечных пустых строк, а также от любых,-
которые не являются частью числа.mapToInt(Integer::parseInt).toArray()
призываетparseInt
каждогоString
дать намint[]
.В качестве альтернативы в Java 9 есть метод Matcher.results , который должен позволять что-то вроде:
В его нынешнем виде ни один из них не является большим улучшением по сравнению с простым циклом по результатам с помощью
Pattern
/,Matcher
как показано в других ответах, но это должно быть проще, если вы хотите продолжить это с помощью более сложных операций, которые значительно упрощаются с использованием потоки.источник
Извлеките все действительные числа, используя это.
источник
Знаки дроби и группировки для представления действительных чисел могут различаться в зависимости от языка. Одно и то же действительное число можно записать по-разному в зависимости от языка.
Число два миллиона на немецком языке
2,000,000.00
и на английском
2.000.000,00
Метод полного извлечения действительных чисел из заданной строки независимым от языка способом:
источник
Если вы хотите исключить числа, содержащиеся в словах, например bar1 или aa1bb, добавьте границы слов \ b к любому из ответов на основе регулярных выражений. Например:
дисплеи:
источник
Я бы предложил проверить значения ASCII для извлечения чисел из строки. Предположим, у вас есть входная строка как myname12345, и если вы хотите просто извлечь числа 12345, вы можете сделать это, сначала преобразовав строку в массив символов, а затем используйте следующий псевдокод
как только числа будут извлечены, добавьте их в массив
Надеюсь это поможет
источник
Я нашел это выражение самым простым
источник
извлекает только числа из строки
источник