2011-10-07 19 views

Respuesta

45

mira String.indexOf y String.substring.

Asegúrate de marcar -1 para indexOf.

+0

corto y dulce. Recuerde también que indexOf proporciona el primer índice de la subcadena. –

10

o puede intentar algo así como

"abc.def.ghi".substring(0,"abc.def.ghi".indexOf(c)-1);

+3

se bloqueará 'c' no está en la cadena como indexOf devolverá -1 – TofuBeer

+0

@UnUs Hayat ¿Qué pasa si el nombre de archivo es 'def.hij.klm'? ¿Cómo funcionaría tu código entonces? (Su código solo funciona para este ejemplo; también podría escribir una función que devuelva '" abc "' - funcionaría igual de bien) – Bohemian

+0

@Bohemian: Sé que faltan casos y controles de límite. Fue una respuesta específica a la pregunta específica y la idea fue dar la idea general a través de un ejemplo :). –

2

Cómo sobre el uso de expresiones regulares?

String firstWord = filename.replaceAll("\\..*","") 

Esto reemplaza todo, desde el primer punto hasta el final con "" (es decir, se aclara que, dejándole con lo que quiere)

Aquí está una prueba:

System.out.println("abc.def.hij".replaceAll("\\..*", ""); 

de salida:

abc 
+5

No perdoné, (y acepto que apesta cuando las personas votan sin razón) pero su solución es bastante costosa y no demasiado obvia. – TofuBeer

+2

@TofuBeer ¿Puedes mostrarnos cómo es caro? –

+1

@ Knickerless-Noggins Puedo describirlo, si quieres detalles puedo hacerlo también ... pero no estoy seguro de cómo podría hacerlo en un comentario (quizás tenga que hacer otra pregunta/respuesta). Es costoso porque crea una cadena completamente nueva junto con todos los reemplazos de los caracteres. substring simplemente devuelve una vista en la cadena. ¿Que ayuda? – TofuBeer

2

En java.lang.String usted consigue algunos métodos como indexOf(): el que devuelve primer índice de un cha r/string. y lstIndexOf: que devuelve el último índice de cuerdas/char

De Java Doc:

public int indexOf(int ch) 
    public int indexOf(String str) 

Devuelve el índice dentro de esta cadena de la primera aparición del carácter especificado.

65

Usted puede simplemente split la cadena ..

public String[] split(String regex) 

Tenga en cuenta que java.lang.String.split utiliza el valor de expresiones regulares de delimitador. Básicamente así ...

String filename = "abc.def.ghi";  // full file name 
String[] parts = filename.split("\\."); // String array, each element is text between dots 

String beforeFirstDot = parts[0]; // Text before the first dot 

Por supuesto, esto se divide en varias líneas para clairity. Podría escribirse como

String beforeFirstDot = filename.split("\\.")[0]; 
+5

Su propuesta no es correcta, porque java.lang.String.split toma regex valor como atributo, no solo cadena. Todas "." en su ejemplo, debe cambiarse a "\\". Entonces funcionará :) –

+1

Me encanta Regex, pero eso me atrapa todo el tiempo. –

37

Si su proyecto ya utiliza commons-lang, StringUtils proporcionan un método agradable para este propósito:

String filename = "abc.def.ghi"; 

String start = StringUtils.substringBefore(filename, "."); // returns "abc" 

ver javadoc [2.6][3.1]

60

La respuesta aceptada es correcta pero no te dice cómo usarlo. Así es como usa las funciones indexOf y substring juntas.

String filename = "abc.def.ghi";  // full file name 
int iend = filename.indexOf("."); //this finds the first occurrence of "." 
//in string thus giving you the index of where it is in the string 

// Now iend can be -1, if lets say the string had no "." at all in it i.e. no "." is not found. 
//So check and account for it. 

if (iend != -1) 
String subString= filename.substring(0 , iend); //this will give abc 
+1

Este es un código no válido porque no puede poner una declaración de variable en el cuerpo de una instrucción If sin llaves. – Clashsoft

0

Aquí es el código que devuelve una subcadena de una String hasta cualquiera de una lista dada de caracteres:

/** 
* Return a substring of the given original string until the first appearance 
* of any of the given characters. 
* <p> 
* e.g. Original "ab&cd-ef&gh" 
* 1. Separators {'&', '-'} 
* Result: "ab" 
* 2. Separators {'~', '-'} 
* Result: "ab&cd" 
* 3. Separators {'~', '='} 
* Result: "ab&cd-ef&gh" 
* 
* @param original the original string 
* @param characters the separators until the substring to be considered 
* @return the substring or the original string of no separator exists 
*/ 
public static String substringFirstOf(String original, List<Character> characters) { 
    return characters.stream() 
      .map(original::indexOf) 
      .filter(min -> min > 0) 
      .reduce(Integer::min) 
      .map(position -> original.substring(0, position)) 
      .orElse(original); 
} 
Cuestiones relacionadas