# String Pattern / Zeichen loeschen



## MyD (16. Mai 2008)

Hi Jungs,

hab ein kleines Problem wobei ihr mir sicherlich helfen koennt. Ich habe immer einen String der mehrere Zeichen enthaelt. Ich moechte alle Zeichen loeschen die aber nicht zwischen Buchstaben oder Zahlen stehen.

z.B. 


anyone can edit . 2,374,755 articles and 2.40 -high
Jump to: navigation, search
M-65

daraus sollte dann werden:


anyone can edit 2,374,755 articles and 2.40 high
Jump to navigation search
M-65

Sprich wenn ein Zeichen Woerter verbindet soll das auch so bleiben. Genauso bei zahlen. Wenn zeichen vor oder nach dem Wort kommen sollen sie geloscht werden. Schliesslich haben sie mit dem eigentlichen Sinn nichts zu tun.

Vielen Dank im voraus fuer eure Hilfe.


----------



## d4rkY89 (16. Mai 2008)

```
public class ClearString
{
  public static void main( String[] args )
  {
    String derString = "anyone can edit . 2,374,755 articles and 2.40 -high";
    String[] a_Zeichen = { "-", "+", ".", ":", ",", ";" };
    String[] a_String = derString.split( "[ ]" );

    for( int i = 0; i < a_String.length; i++ )
    {
      for( int j = 0; j < a_Zeichen.length; j++ )
      {
        if( a_String[i].startsWith( a_Zeichen[j] ) || a_String[i].endsWith( a_Zeichen[j] ) )
        {
          a_String[i] = a_String[i].replace( a_Zeichen[j], "" );
        }
      }
    }

    String clearString = "";
    for( String s : a_String )
      if( !s.equals("") )
        clearString += s + " ";
    clearString = clearString.trim();

    System.out.println( clearString );
  }
}
```

Du müsstest vielleicht noch die Zeichen ergänzen, wie du sie haben möchtest.
Falls noch Fragen auftauchen, einfach losfragen


----------



## MyD (17. Mai 2008)

Problem ist das auch nicht korrekte Zeichen kommen koennten:

z.B. Ôø?

Gibt es nicht irgenein Pattern das alle Zeichen ausschliesst vor u nach einem Wort?

Aber danke schonmal fuer die Antwort


----------



## d4rkY89 (17. Mai 2008)

Hm mit der Klasse Pattern kenn ich mich leider nicht aus. Allerdings könnte dir diese Seite vielleicht weiterhelfen: http://www.bastie.de/index.html?/java/mjregular/index.html


----------



## d4rkY89 (17. Mai 2008)

ich hab mir das auch mal ein wenig angeschaut.

```
import java.util.regex.*;

public class ClearString
{
  public static void main( String[] args )
  {
    String str = "anyone can edit . 2,374,755 articles and 2.40 -high";
    Pattern p = Pattern.compile ("[[a-z][A-Z][0-9][ ]]");
    Matcher m = p.matcher( str );
    
    String clearString ="";
    while (m.find())
    {
      clearString += m.group();
    }
    
    System.out.println( clearString );
  }
}
```

dieses Programm schnippelt jetzt alles raus, was kein Buchstabe oder keine Zahl ist. Wie man das jetzt noch macht, dass er Ausnahmefälle wie "M-65" beachtet weiß ich nicht / noch nicht. Aber vielleicht hilft dir das Programm schon mal zum Verständnis weiter.


----------



## Thomas Darimont (17. Mai 2008)

Hallo,

schau mal hier:

```
/**
 * 
 */
package de.tutorials;

/**
 * @author Tom
 *
 */
public class RegexExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String regex = "((?<![\\w\\d])([^\\d\\w\\s])|([^\\d\\w\\s])(?![\\w\\d]))";
        
        
        String[] strings ={
                "anyone can edit . 2,374,755 articles and 2.40 -high",
                "Jump to: navigation, search",
                "M-65"
        };
        
        for(String string : strings){
            System.out.println(string.replaceAll(regex, ""));
            System.out.println(replaceNonWordOrNumberConnectingChars(string)); //handmade...
        }
    }

    private static String replaceNonWordOrNumberConnectingChars(String string) {
        StringBuilder stringBuilder = new StringBuilder(string.length());
        for(int i = 0, len = string.length();i < len;i++){
            char c = string.charAt(i);
            if(Character.isDigit(c) || Character.isLetter(c) || Character.isWhitespace(c)){
                stringBuilder.append(c);
            }else{
                if(i > 0){
                    char preceedingChar = string.charAt(i-1);
                    boolean wordOrNumberCharacterBefore = (Character.isDigit(preceedingChar) || Character.isLetter(preceedingChar));
                    boolean wordOrNumberCharacterAfter = false;
                    if(i + 1 < len ){
                        char followingChar = string.charAt(i+1);
                        wordOrNumberCharacterAfter = (Character.isDigit(followingChar) || Character.isLetter(followingChar));
                    }
                    
                    if(wordOrNumberCharacterBefore && wordOrNumberCharacterAfter){
                        stringBuilder.append(c);
                    }
                    
                }    
            }
        }
        return stringBuilder.toString();
    }

}
```

Ausgabe:

```
anyone can edit  2,374,755 articles and 2.40 high
anyone can edit  2,374,755 articles and 2.40 high
Jump to navigation search
Jump to navigation search
M-65
M-65
```

Gruß Tom


----------



## MyD (17. Mai 2008)

Hey Tom,

echt mal respekt! Werde es mir gleich anschauen. Aber was ich bisher immer von dir hier so im Forum gesehen habe war sehr brauchbar. Melde mich sobald ich es getestet habe.

Danke!

MfG MyD


----------



## MyD (17. Mai 2008)

Hi Tom,

Vielen Vielen Dank das klappt echt wunderbar. Leider bin ich in Pattern noch nicht so fitt. Muss mir das ganze mal mit Perl anschauen. Ist ja das gleiche oder? Was muss ich denn noch machen wenn ich % erlauben moechte

z.B.

 hallo 79% -richtig

 hallo 79% richtig


Vielen Dank fuer deine Antowort.

MfG MyD


----------



## Thomas Darimont (17. Mai 2008)

Hallo,

schau mal hier:

```
/**
 * 
 */
package de.tutorials;

/**
 * @author Tom
 *
 */
public class RegexExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String regex = "((?<![\\w\\d])([^\\d\\w\\s])|([^\\d\\w\\s%])(?![\\w\\d]))";
        
        
        String[] strings ={
                "anyone can edit . 2,374,755 articles and 2.40 -high",
                "Jump to: navigation, search",
                "M-65",
                "hallo 79% -richtig"
        };
        
        for(String string : strings){
            System.out.println(string.replaceAll(regex, ""));
            System.out.println(replaceNonWordOrNumberConnectingChars(string)); //handmade...
        }
    }

    private static String replaceNonWordOrNumberConnectingChars(String string) {
        StringBuilder stringBuilder = new StringBuilder(string.length());
        for(int i = 0, len = string.length();i < len;i++){
            char c = string.charAt(i);
            if(Character.isDigit(c) || Character.isLetter(c) || Character.isWhitespace(c) || c=='%'){
                stringBuilder.append(c);
            }else{
                if(i > 0){
                    char preceedingChar = string.charAt(i-1);
                    boolean wordOrNumberCharacterBefore = (Character.isDigit(preceedingChar) || Character.isLetter(preceedingChar));
                    boolean wordOrNumberCharacterAfter = false;
                    if(i + 1 < len ){
                        char followingChar = string.charAt(i+1);
                        wordOrNumberCharacterAfter = (Character.isDigit(followingChar) || Character.isLetter(followingChar));
                    }
                    
                    if(wordOrNumberCharacterBefore && wordOrNumberCharacterAfter){
                        stringBuilder.append(c);
                    }
                    
                }    
            }
        }
        return stringBuilder.toString();
    }

}
```

Gruß Tom


----------



## MyD (17. Mai 2008)

Hehe danke du Java Profi,

Geht! Super dank dir vielmals! Ein kleines Problem habe ich noch uebrig. Wenn ich manche Documente parse bekomme ich solche Strigns hier:

Input: A‚ÄìZ index

Output (nach deiner fkt.) 
a‚äìz
index

Problem hier ist die Kodierung des Strings a‚äìz nehme ich mal an. Kann man das auch irgendwie mit dem Pattern rausholen?

MfG MyD


----------

