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.


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.


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.


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.


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

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.


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

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.


1

Esto debería funcionar

 Integer i= Integer.parseInt(text.substring(text.length() - 7));

1

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

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



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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.