String Pattern / Zeichen loeschen

MyD

Grünschnabel
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.
 
Code:
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 :P
 
Zuletzt bearbeitet:
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
 
ich hab mir das auch mal ein wenig angeschaut.
Code:
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.
 
Hallo,

schau mal hier:
Java:
/**
 * 
 */
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:
Code:
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
 
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
 
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
 
Hallo,

schau mal hier:
Java:
/**
 * 
 */
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
 
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
 
Zurück