Cómo obtener los últimos caracteres de una cadena en Java, independientemente del tamaño de la cadena

80

Estoy buscando una forma de extraer los últimos caracteres de una cadena, independientemente del tamaño. Tomemos estas cadenas como ejemplo:

"abcd: efg: 1006746"
"bhddy: nshhf36: 1006754"
"hfquv: nd: 5894254"

Como puede ver, cadenas completamente aleatorias, pero tienen 7 números al final. ¿Cómo podría tomar esos 7 números?

Editar:

Me acabo de dar cuenta de que String[] string = s.split(": ");funcionaría muy bien aquí, siempre y cuando llame a la cadena [2] para los números y la cadena [1] para cualquier cosa en el medio.

CachorroKevin
fuente
Tanto su pregunta como varias respuestas mencionan String.split(), pero vale la pena señalar que s.split(": ")compilará una nueva java.uitl.regex.Patterncada vez que la llame, luego hará coincidir su cadena con ese patrón, creando una expresión regular Matchery una ArrayListantes de la String[]que se devuelve. Será relativamente lento y destinará mucho más de lo necesario para resolver este problema. Si esto es importante depende de la naturaleza de su aplicación. Generalmente evito a split()menos que realmente lo necesite. (Tenga en cuenta que split()no no utilizar expresiones regulares si se divide en un solo carácter.)
rjb1290

Respuestas:

104

Muchas cosas que podrías hacer.

s.substring(s.lastIndexOf(':') + 1);

obtendrá todo después de los últimos dos puntos.

s.substring(s.lastIndexOf(' ') + 1);

todo después del último espacio.

String numbers[] = s.split("[^0-9]+");

divide todas las secuencias de dígitos; el último elemento de la matriz de números es probablemente lo que desea.

Chris Dodd
fuente
4
Un aspecto fortuito del lastIndexOfenfoque es que si no hay espacios, lastIndexOfdevolverá -1, por lo que terminará con la cadena completa ( s.substring(0)).
Jon Skeet
s.substring (s.lastIndexOf (':') + 1); Me gustaría usar eso, pero ¿cómo podría obtener las letras después de los primeros dos puntos? ¿No estaría en el índice de (":", 1)?
PuppyKevin
144

Qué tal si:

String numbers = text.substring(text.length() - 7);

Eso supone que no son de 7 caracteres al final, por supuesto. Lanzará una excepción si lo pasa "12345". Puede abordar eso de esta manera:

String numbers = text.substring(Math.max(0, text.length() - 7));

o

String numbers = text.length() <= 7 ? text : text.substring(text.length() - 7);

Tenga en cuenta que esto todavía no está validando que la cadena resultante contenga números, y aún generará una excepción si textes nula.

Jon Skeet
fuente
54

Esta pregunta es el principal resultado de Google para "Java String Right".

Sorprendentemente, nadie ha mencionado todavía Apache Commons StringUtils.right () :

String numbers = org.apache.commons.lang.StringUtils.right( text, 7 );

Esto también maneja el caso donde textes nulo, donde muchas de las otras respuestas arrojarían una NullPointerException.

Richard Inglis
fuente
1
Yo también me pregunto. De esta forma es mucho más seguro que manejar todos los posibles problemas.
Jaroslav Kuboš
Esta es también la única respuesta que funciona si desea / necesita una sola expresión para convertir de forma segura algo en una cadena y llegar a los últimos ncaracteres. Por ejemplo, podrías hacerlo StringUtils.right(Objects.toString(someObj), 7).
rjb1290
23

Este código me funciona perfectamente:

String numbers = text.substring(Math.max(0, text.length() - 7));
Shehbaz Khan
fuente
7

Puede lograrlo usando este código de una sola línea :

String numbers = text.substring(text.length() - 7, text.length());

Pero asegúrese de detectar la excepción si la longitud de la cadena de entrada es menor que 7 .

Puede reemplazar 7 con cualquier número, por ejemplo N, si desea obtener los últimos 'N' caracteres.

Sumanth
fuente
1
Es mejor verificar de antemano si la longitud de entrada es 7 o más, y luego hacer la subcadena.
orique
4

Que haría uso de cualquiera String.splito de una expresión regular:


Usando String.split

String[] numberSplit = yourString.split(":") ; 
String numbers = numberSplit[ (numberSplit.length-1) ] ; //!! last array element

Usar RegEx (requiere import java.util.regex.*)

String numbers = "" ;
Matcher numberMatcher = Pattern.compile("[0-9]{7}").matcher(yourString) ;
    if( matcher.find() ) {
            numbers = matcher.group(0) ;
    } 
FK82
fuente
2
Regex debe [0-9]{7}$asegurarse de que coincida con los últimos 7 dígitos.
whiskeysierra
@ Willi Schönborn: De acuerdo. El caso del OP sugirió que los otros grupos de la cadena siempre contendrían letras. Supuse que era innecesario especificar un límite.
FK82
2
String inputstr = "abcd: efg: 1006746"
int startindex = inputstr.length() - 10;
String outputtendigitstr = inputstr.substring(startindex);

Asegúrese de verificar que la longitud de la cuerda sea superior a 10.

usuario2902302
fuente
1

Esto debería funcionar

 Integer i= Integer.parseInt(text.substring(text.length() - 7));
Prasoon Saurav
fuente
1

StringUtils.substringAfterLast ("abcd: efg: 1006746", ":") = "1006746";

Siempre que el formato de la cadena sea fijo, puede usar substringAfterLast .

Agyeya Gupta
fuente
0

Por ejemplo: "abcd: efg: 1006746" "bhddy: nshhf36: 1006754" "hfquv: nd: 5894254"

-Paso 1: String firstString = "abcd: efg: 1006746";

-Paso 2: String lastSevenNumber = firstString.substring(firstString.lastIndexOf(':'), firstString.length()).trim();

Ronak Patel
fuente