# String am ende abschneiden



## eclipseBeginner (9. Sep 2009)

Hallo,

ich habe einen String bei dem sich teilweise am ende ein _fail bzw.  _ok befindet. Nun möchte ich einen String haben, bei dem genau dieses ende abgeschnitten ist. Der String kann allerdings auch in der mitte vorkommen. Er soll aber bloß am ende abgeschnitten werden.

ich habe es  jetzt so gemacht, das ich mit einer while schleife das letzte vorkommen des Teilstrings prüfe und wenn er vorkommt, dann noch schaue ob er auch am ende liegt. Anschließend schneide ich ihn ab, wenn der index größer -1 ist.


```
String lang = "test_non_xxxx";
		
		String[] ende = {"_ok", "_fail", "_other"};
		
		int index = -1;
		int i = ende.length;
		while ((index == -1) && (i != 0 ))
		{
			i--;
			index = lang.lastIndexOf(ende[i]);
			System.out.println("Index:"+ index);
			if (index+ende[i].length()!= lang.length())
				index = -1;
			System.out.println(i);
		}
		
		String kurz = (index == -1 ? lang : lang.substring(0,index));
		System.out.println(kurz);
```

Ich denke aber das meine Variante sehr aufwändig und umständlich ist. Gibts da noch ne andere Möglichkeit, das ganze etwas kürzer zu lösen.


----------



## Verjigorm (9. Sep 2009)

eclipseBeginner hat gesagt.:


> Der String kann allerdings auch in der mitte vorkommen. Er soll aber bloß am ende abgeschnitten werden.



teste doch auf endswith() 

```
If("bla_ok".endsWith("_ok"))
...
```


----------



## SlaterB (9. Sep 2009)

und am coolsten

```
public class Test
{
    static final Pattern p = Pattern.compile("_(ok|fail|other)$");

    public static void main(String[] args)
    {
        test("_ok");
        test("_ok ");
        test("_ok_");
    }

    public static void test(String st)
    {
        Matcher m = p.matcher(st);
        System.out.println(m.find());
    }
}
```


----------



## eclipseBeginner (9. Sep 2009)

hallo,

danke für die Antworten. 

Habe es jetzt mit endsWith probiert. Allerdigns habe ich da immernoch die Schleife. 

```
String lang = "test_non_xxxx";
		String[] ende = {"_yes", "_no", "_xxxx"};
		
		int index = -1;
		int i = ende.length;
		while ((index == -1) && (i != 0 ))
		{
			i--;
			if (lang.endsWith(ende[i]))
					index = lang.lastIndexOf(ende[i]);					
		}		
		String kurz = (index == -1 ? lang : lang.substring(0,index));
		System.out.println(kurz);
```

Gibt es nicht noch einen kürzeren Weg. 
@Slater: Bei deiner version erkenne ich ja nur, ob einer der drei Varianten zutrifft aber nicht welche. Und kann somit auch nicht die richtige Länge abschneiden, oder hab ich da was falsch verstanden?


----------



## SlaterB (9. Sep 2009)

ach so, ja,
wollte das eh anders posten

```
public class Test
{
    static final Pattern p = Pattern.compile("_(ok|fail|other)$");

    public static void main(String[] args)
        throws Exception
    {
        machKaputt("_ok");
        machKaputt("_ok ");
        machKaputt("_ok_");
        machKaputt("d_ok");
        machKaputt("  d_ok");
        machKaputt("  d_fail");
        machKaputt("x  d_other");
        machKaputt("x  d_otherr");

    }

    public static void machKaputt(String st)
    {
        Matcher m = p.matcher(st);
        st = m.replaceAll("");
        System.out.println("kaputt: " + st);

    }
}
```
Ausgabe:

```
kaputt: 
kaputt: _ok 
kaputt: _ok_
kaputt: d
kaputt:   d
kaputt:   d
kaputt: x  d
kaputt: x  d_otherr
```

gezaubert wird da aber auch nicht, die Schleifen, sicher viel mehr, sind nur in die Bibliotheksmethoden verschoben

bei wirklich einfachen String-Methoden ist gegen eine gute Schleife nix einzuwenden

wenn man ganz auf Performance verzichtet wäre das kürzeste etwas in Richtung von

```
String st = "x_ok_faild_ok".replaceAll("_(ok|fail|other)$", "");
System.out.println(st);
```


----------



## eclipseBeginner (9. Sep 2009)

Hallo,

danke das funktioniert.

Kannst du mir mal bitte erklären wie das in deiner zweiten Variante funktioniert das nur der string am ende und nicht in der mitte gelöscht wird.


----------



## bygones (9. Sep 2009)

eclipseBeginner hat gesagt.:


> Hallo,
> 
> danke das funktioniert.
> 
> Kannst du mir mal bitte erklären wie das in deiner zweiten Variante funktioniert das nur der string am ende und nicht in der mitte gelöscht wird.



das $ kennzeichnet das Ende...


----------

