Eu tenho uma variável String (basicamente uma frase em inglês com um número não especificado de números) e gostaria de extrair todos os números em uma matriz de inteiros. Eu queria saber se existe uma solução rápida com expressões regulares?
Usei a solução de Sean e mudei um pouco:
LinkedList<String> numbers = new LinkedList<String>();
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(line);
while (m.find()) {
numbers.add(m.group());
}
Respostas:
... imprime
-2
e12
.-? corresponde a um sinal negativo inicial - opcionalmente. \ d corresponde a um dígito, e precisamos escrever
\
como\\
em uma string Java. Portanto, \ d + corresponde a 1 ou mais dígitos.fonte
2,000
. Para tal uso-?\\d+,?\\d+|-?\\d+
-?\\d+(,\\d{3})*
deve funcionar.Que tal usar o
replaceAll
método java.lang.String:Resultado:
Descrição
[
e]
delimita um conjunto de caracteres para uma única correspondência, ou seja, apenas uma vez em qualquer ordem^
Identificador especial usado no início do conjunto, usado para indicar a correspondência de todos os caracteres não presentes no conjunto delimitado, em vez de todos os caracteres presentes no conjunto.+
Entre uma e ilimitadas vezes, tantas vezes quanto possível, retribuindo conforme necessário-?
Um dos personagens “-” e “?”0-9
Um caractere no intervalo entre “0” e “9”fonte
-
por si só como um número, juntamente com coisas como9-
,---6
, e1-2-3
.Na verdade, você pode substituir [0-9] por \ d, mas isso envolve um escape de barra invertida dupla, o que torna a leitura mais difícil.
fonte
Isso é para extrair números retendo o decimal
fonte
A resposta aceita detecta dígitos, mas não detecta números formatados, por exemplo, 2.000, nem decimais, por exemplo, 4,8. Para tal uso
-?\\d+(,\\d+)*?\\.?\\d+?
:Resultado:
[4.8, 2,000]
fonte
(?:\.\d+)?
)para números racionais, use este:
(([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))
fonte
Usando o Java 8, você pode fazer:
Se você não tiver números negativos, pode se livrar do
replaceAll
(e usar!s.isEmpty()
emfilter
), pois isso é apenas para dividir corretamente algo como2-34
(isso também pode ser tratado puramente com regex emsplit
, mas é bastante complicado).Arrays.stream
transforma nossoString[]
em umStream<String>
.filter
livra-se das strings vazias iniciais e finais, bem como de qualquer-
que não faça parte de um número.mapToInt(Integer::parseInt).toArray()
pedeparseInt
a cada umString
para nos dar umint[]
.Como alternativa, o Java 9 tem um método Matcher.results , que deve permitir algo como:
Do jeito que está, nada disso é uma grande melhoria em relação a apenas repetir os resultados com
Pattern
/Matcher
conforme mostrado nas outras respostas, mas deve ser mais simples se você quiser seguir com operações mais complexas que são significativamente simplificadas com o uso de córregos.fonte
Extraia todos os números reais usando isso.
fonte
Caracteres de fração e agrupamento para representar números reais podem diferir entre os idiomas. O mesmo número real pode ser escrito de maneiras muito diferentes, dependendo do idioma.
O número dois milhões em alemão
2.000.000,00
e em ingles
2.000.000,00
Um método para extrair totalmente números reais de uma determinada string de uma forma agnóstica de linguagem:
fonte
Se você deseja excluir os números contidos nas palavras, como bar1 ou aa1bb, adicione limites de palavras \ b a qualquer uma das respostas baseadas em regex. Por exemplo:
exibe:
fonte
Eu sugeriria verificar os valores ASCII para extrair números de uma String Suponha que você tenha uma String de entrada como meunome12345 e se você quiser apenas extrair os números 12345, você pode fazer isso primeiro convertendo a String em Matriz de Caracteres e então use o seguinte pseudocódigo
uma vez que os números são extraídos, anexe-os a um array
Espero que isto ajude
fonte
Eu achei esta expressão mais simples
fonte
extrai apenas números da string
fonte