Tengo una variable de cadena (básicamente una oración en inglés con un número de números no especificado) y me gustaría extraer todos los números en una matriz de números enteros. Me preguntaba si había una solución rápida con expresiones regulares.
Usé la solución de Sean y la cambié ligeramente:
LinkedList<String> numbers = new LinkedList<String>();
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(line);
while (m.find()) {
numbers.add(m.group());
}
Respuestas:
... impresiones
-2
y12
.-? coincide con un signo negativo inicial, opcionalmente. \ d coincide con un dígito, y debemos escribir
\
como\\
en una cadena Java. Entonces, \ d + coincide con 1 o más dígitos.fuente
2,000
. Ej . Para tal uso-?\\d+,?\\d+|-?\\d+
-?\\d+(,\\d{3})*
debería funcionar.¿Qué pasa con el
replaceAll
método java.lang.String?Salida:
Descripción
[
y]
delimita un conjunto de caracteres para que coincidan individualmente, es decir, solo una vez en cualquier orden^
Identificador especial utilizado al principio del conjunto, utilizado para indicar que coinciden todos los caracteres que no están presentes en el conjunto delimitado, en lugar de todos los caracteres presentes en el conjunto.+
Entre una y una cantidad ilimitada de veces, tantas veces como sea posible, devolviendo según sea necesario-?
Uno de los caracteres "-" y "?"0-9
Un carácter en el rango entre "0" y "9"fuente
-
por sí mismo como un número, junto con cosas como9-
,---6
, y1-2-3
.En realidad, puede reemplazar [0-9] con \ d, pero eso implica un escape de doble barra invertida, lo que hace que sea más difícil de leer.
fuente
Esto es para extraer números reteniendo el decimal
fuente
La respuesta aceptada detecta dígitos pero no detecta números formateados, por ejemplo, 2000, ni decimales, por ejemplo, 4.8. Para tal uso
-?\\d+(,\\d+)*?\\.?\\d+?
:Salida:
[4.8, 2,000]
fuente
(?:\.\d+)?
)para números racionales usa este:
(([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))
fuente
Con Java 8, puede hacer:
Si no tiene números negativos, puede deshacerse de
replaceAll
(y usar!s.isEmpty()
enfilter
), ya que eso es solo para dividir correctamente algo como2-34
(esto también se puede manejar puramente con expresiones regularessplit
, pero es bastante complicado).Arrays.stream
convierte nuestroString[]
en unStream<String>
.filter
elimina las cadenas vacías iniciales y finales, así como las-
que no forman parte de un número.mapToInt(Integer::parseInt).toArray()
pideparseInt
a cada unoString
que nos dé unint[]
.Alternativamente, Java 9 tiene un método Matcher.results , que debería permitir algo como:
Tal como está, ninguno de estos es una gran mejora con respecto a simplemente recorrer los resultados con
Pattern
/Matcher
como se muestra en las otras respuestas, pero debería ser más simple si desea seguir esto con operaciones más complejas que se simplifican significativamente con el uso de arroyos.fuente
Extrae todos los números reales usando esto.
fuente
Los caracteres de fracciones y agrupaciones para representar números reales pueden diferir entre idiomas. El mismo número real podría escribirse de formas muy diferentes según el idioma.
El número dos millones en alemán
2,000,000.00
y en ingles
2.000.000,00
Un método para extraer completamente números reales de una cadena dada de una manera independiente del idioma:
fuente
Si desea excluir los números que están contenidos en palabras, como bar1 o aa1bb, agregue límites de palabras \ b a cualquiera de las respuestas basadas en expresiones regulares. Por ejemplo:
muestra:
fuente
Sugeriría verificar los valores ASCII para extraer números de una cadena. Supongamos que tiene una cadena de entrada como myname12345 y si solo desea extraer los números 12345 , puede hacerlo convirtiendo primero la cadena en una matriz de caracteres y luego use el siguiente pseudocódigo
Una vez extraídos los números, añádalos a una matriz.
Espero que esto ayude
fuente
Encontré esta expresión más simple
fuente
extrae solo números de la cadena
fuente