Como extrair números de uma string e obter uma matriz de ints?

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 números inteiros. Eu queria saber se havia uma solução rápida com expressões regulares?


Eu usei a solução de Sean e mudei um pouco:

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

 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()); } 

… imprime -2 e 12 .


– corresponde a um sinal negativo principal – opcionalmente. \ d corresponde a um dígito, e precisamos escrever \ as \\ em um Java String. Então, \ d + corresponde a 1 ou mais dígitos.

Que tal usar o método 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(" "))); 

Saída:

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

Descrição

 [^-?0-9]+ 
  • + Entre um e ilimitado vezes, quantas vezes for possível, devolvendo conforme necessário
  • -? Um dos personagens “-?”
  • 0-9 Um caractere no intervalo entre “0” e “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 

Você pode realmente replace [0-9] por \ d, mas isso envolve o escape duplo de contrabarra, o que dificulta a leitura.

  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(); 

Isto é para extrair números mantendo o decimal

para números racionais use este: (([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))

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+? :

  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); 

Saída: [4.8, 2,000]

Usando o Java 8, você pode fazer:

 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] 

Se você não tem números negativos, você pode se livrar do replaceAll (e usar !s.isEmpty() no filter ), pois isso é apenas para dividir corretamente algo como 2-34 (isso também pode ser tratado puramente com regex em split , mas é bastante complicado).

Arrays.stream transforma nosso String[] em um Stream .

filter elimina as seqüências vazias iniciais e finais, bem como qualquer uma delas - que não faz parte de um número.

mapToInt(Integer::parseInt).toArray() chama parseInt em cada String para nos dar um int[] .


Como alternativa, o Java 9 possui um método Matcher.results , que deve permitir algo como:

 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] 

Tal como está, nenhum destes é um grande melhoramento apenas sobre os resultados com Pattern / Matcher como mostrado nas outras respostas, mas deve ser mais simples se quiser seguir isto com operações mais complexas que são significativamente simplificadas com o uso de streams.

Eu sugiro verificar os valores ASCII para extrair números de uma String Suponha que você tenha uma String de input como myname12345 e se você quiser apenas extrair os números 12345 você pode fazer isso primeiro convertendo a string para Character Array e então usar o seguinte psuedocode

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

uma vez que os números são extraídos, anexe-os a um array

Espero que isto ajude

Eu encontrei esta expressão mais simples

 String[] extractednums = msg.split("\\\\D++");