tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
15
ZUGRIFFE
1953
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    magic_halli magic_halli ist offline Mitglied Gold
    Registriert seit
    Jun 2003
    Beiträge
    221
    Hi,

    ich habe einen String, der in etwa so aussehen kann:
    Code java:
    1
    
    String str = "sigma_v=sqrt(sigma^2+3*tau^2)";
    Jetzt möchte ich in solch einem String bspw. 'sigma' ersetzen (z.B. durch einen Zahlenwert).
    Es soll aber nur ersetzt werden, wenn links vom gefundenen Wort (wäre hier 'sigma') entweder ein Leerzeichen oder math. Zeichen ( +,-,*,/,(,),^ etc. ) UND rechts vom gefundenen Wort ebenfalls Leerzeichen, math.Zeichen, oder ein Stringende vorkommt
    Hier in diesem Fall würde/sollte dann 'sigma' ersetzt werden, aber nicht das sigma von 'sigma_v'!
    Wie ich ersetze weis ich. Mir geht es nur um das Überprüfen dieser Kriterien...

    Wie kann ich das anstellen?

    Danke und Gruß.
     

  2. #2
    Andron Andron ist offline Mitglied Gold
    Registriert seit
    Jun 2006
    Beiträge
    180
    Hmm, ich würde zuerst das String mit StringTokenizer passend "zerstückeln".

    z.B.
    StringTokenizer tk = new StringTokenizer (str, "+ - * / ( ) ^");
    Das Problem wäre dabei, dass du auch solche Schlüsselwörter wie "sqrt" abfangen musst.
    In diesem Beispiel würdest du folgende Strings bekommen:
    sigma_v=sqrt
    sigma
    2
    3
    tau

    Nun weißt du, dass 1 String-Teil nicht ersetzt werden darf. Im nächsten Schritt prüfst du, ob es sich um eine Zahl handelt, wenn nicht, ob es ein Schlüsselwort ist, wenn nicht, ersetzen.
     

  3. #3
    Tobias Köhler Tutorials.de Gastzugang
    Noch ein Tipp wäre wenn du dir die Methoden indexOf und substring anguckst
     

  4. #4
    magic_halli magic_halli ist offline Mitglied Gold
    Registriert seit
    Jun 2003
    Beiträge
    221
    Ok, danke für den Tip mit dem StringTokenizer... ich werd mich mal ransetzen und probieren.
     

  5. #5
    magic_halli magic_halli ist offline Mitglied Gold
    Registriert seit
    Jun 2003
    Beiträge
    221
    So, also ich komme irgendwie nicht weiter... ich kann mir zwar per StringTokenizer an den bestimmten Stellen den String zerlegen lassen, aber sobald ich eben per String.replaceAll() ersetzen will, ist es eigentlich völlig egal, wo und wie ich einen String aufsplitte - es wird eben einfach rücksichtslos ersetzt!
    Bspw. wird eben auch in 'sigma_v' das sigma ersetzt, obwohl es ja für mich nichts mit 'sigma' zu tun hat, sondern ein eigenständiger Teilstring ist und somit auch unverändert bleiben soll!
    Hat noch jemand ne Idee oder Vorschlag, wie ich mein Vorhaben erfolgreich umsetzen könnte?

    Gruß.
     

  6. #6
    Tobias Köhler Tutorials.de Gastzugang
    naja, replaceAll ist ja schon aussagekräftig, was das wohl macht
    wie gesagt, du könntest dir ja auch mal indexOf angucken, sollte dir helfen
     

  7. #7
    Ronin-Jay Ronin-Jay ist offline Mitglied Gold
    Registriert seit
    Jun 2003
    Beiträge
    235
    Naja, Du darfst ja auch nicht einfach String.replaceAll() sagen, wenn Du nur ein bestimmtes Sigma ersetzen möchtest. Wenn Du den kompletten String mittels Tokenizer zerlegt hast, prüfst Du zunächst, ob ein komplettes Segment des Tokenizers nur mit 'sigma' gefüllt ist. Trifft dies zu, schaust Du Dir das Token davor und danach an und handelst nach Deinen Kriterien:
    ...Es soll aber nur ersetzt werden, wenn links vom gefundenen Wort (wäre hier 'sigma') entweder ein Leerzeichen oder math. Zeichen ( +,-,*,/,(,),^ etc. ) UND rechts vom gefundenen Wort ebenfalls Leerzeichen, math.Zeichen, oder ein Stringende vorkommt
    Wobei das Leerzeichen beim Tokenizer ja wegfällt.....
     

  8. #8
    magic_halli magic_halli ist offline Mitglied Gold
    Registriert seit
    Jun 2003
    Beiträge
    221
    Wenn Du den kompletten String mittels Tokenizer zerlegt hast, prüfst Du zunächst, ob ein komplettes Segment des Tokenizers nur mit 'sigma' gefüllt ist.
    Wie prüfe ich das ab, ob es NUR mit sigma gefüllt ist?
     

  9. #9
    magic_halli magic_halli ist offline Mitglied Gold
    Registriert seit
    Jun 2003
    Beiträge
    221
    Ist es vielleicht irgendwie möglich, ganz geziehlt auf einen Token zuzugreifen?
    Ich kann mir ja mittels countTokens() die Anzahl der Tokens ermitteln. Jetzt würde ich gern auf bspw. Token Nummer 3 zugreifen, um diesen zu manipulieren.
     

  10. #10
    MiMi MiMi ist offline Mitglied Smaragd
    Registriert seit
    Sep 2007
    Beiträge
    1.177
    Du koenntest alle tokens in ein Array schreiben und dann gezielt auf eins zugreifen.
     

  11. #11
    Andron Andron ist offline Mitglied Gold
    Registriert seit
    Jun 2006
    Beiträge
    180
    StringTokenizer tk = new StringTokenizer(str, "/ * usw.");
    int counter = 0;
    String myTk = null;
    String editedString = null;
    while(tk.hasMoreTokens())
    {
    myTk = tk.nextToken();
    System.out.println(myTk);
    counter = ++;
    if(counter == 3) editedString = editToken(myTk);
    }

    private String editToken (String toEdit)
    {
    String editedString = null;
    // hier bearbeiten
    return editedString
    }
    Geändert von Andron (05.11.07 um 15:16 Uhr)
     

  12. #12
    Ronin-Jay Ronin-Jay ist offline Mitglied Gold
    Registriert seit
    Jun 2003
    Beiträge
    235
    Wie mimij85 schon sagt, muß Du dann alle Token in eine ArrayLIst schreiben und kannst Du direkt über den Index auf ein Token zugreifen:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    import java.util.ArrayList;
    import java.util.StringTokenizer;
     
    public class StrTokenizerExample {
        
        /**
         * @param args
         */
        public static void main(String[] args) {
            
            String str             = "Ich bin mal ein längerer unsinniger Satz " +
                                     "ohne jegliche Bedeutung.";
            StringTokenizer strTk  = new StringTokenizer(str);
            ArrayList       tkList = new ArrayList();
            while (strTk.hasMoreTokens()) {
                tkList.add(strTk.nextToken().toString());
            }
            System.out.println(tkList.get(2));
            
            
        }
    }
     

  13. #13
    MiMi MiMi ist offline Mitglied Smaragd
    Registriert seit
    Sep 2007
    Beiträge
    1.177
    Zitat Zitat von Andron Beitrag anzeigen
    StringTokenizer tk = new StringTokenizer(str, "/ * usw.");
    int counter = 0;
    String myTk = null;
    String editedString = null;
    while(tk.hasMoreTokens())
    {
    myTk = tk.nextToken();
    System.out.println(myTk);
    counter = ++;
    if(counter == 3) editedString = editToken(myTk);
    }

    private String editToken (String toEdit)
    {
    String editedString = null;
    // hier bearbeiten
    return editedString
    }

    Andron, das ist ziemlich umstaendlich. Vorallem was soll
    counter = ++;
    Also mit ner Arrayliste, ist das wesentlich einfacher, man muss nicht jedes mal alle tokens durchlaufen, und kann direkt auf das jeweilige zugreifen

    Und benutz bitte [.CODE] oder [.JAVA] , das ist besser zu lesen.
     

  14. #14
    Andron Andron ist offline Mitglied Gold
    Registriert seit
    Jun 2006
    Beiträge
    180
    Das weiß ich doch.
    Ich wollte nur veranschaulichen, wie man an die Tokens ran kommt.
    Mit dem counter war ein Beispiel, wenn man nur das dritte Token lesen möchte.
     

  15. #15
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    warum so kompliziert? Statte alle deine "Variablen" einfach mit einem entsprechenden Präfix aus ($,#) und dann nimmst du alle alphanumerischen Zeichenfolgen die darauf folgen als Variablennamen...

    Schau mal hier:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    
    /**
     * 
     */
    package de.tutorials;
     
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
     
    import javax.script.Bindings;
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
     
    /**
     * @author Thomas.Darimont
     *
     */
    public class VariableExtractionExample {
     
      /**
       * @param args
       */
      public static void main(String[] args) throws Exception{
        
        String formula = "($a+$b32a*$cS_W12)*2";
        
        System.out.println(Arrays.toString(extractVariablesFrom(formula)));
        
        ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("javascript");
        Bindings bindings = scriptEngine.createBindings();
        bindings.put("$a", 2);
        bindings.put("$b32a", 3);
        bindings.put("$cS_W12", 4);
        
        System.out.println(scriptEngine.eval(formula, bindings));
     
      }
     
      private static String[] extractVariablesFrom(String formula) {
        List<String> variables = new ArrayList<String>();
        
        Matcher matcher = Pattern.compile("(\\$[\\w\\d_]+)").matcher(formula);
        while(matcher.find()){
          variables.add(matcher.group());
        }
        
        return variables.toArray(new String[0]);
      }
     
    }

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

Ähnliche Themen

  1. Zeilenumbrüche ersetzen, außer wenn <table>
    Von crsakawolf im Forum ASP
    Antworten: 0
    Letzter Beitrag: 22.01.10, 11:15
  2. mysql Abfrage wenn vohanden, dann ersetzen
    Von Delta-787 im Forum PHP
    Antworten: 24
    Letzter Beitrag: 24.05.09, 22:43
  3. Text ersetzen wenn...
    Von Katharsis Freak im Forum Linux & Unix
    Antworten: 2
    Letzter Beitrag: 25.06.08, 06:07
  4. Antworten: 4
    Letzter Beitrag: 03.07.07, 14:19
  5. Antworten: 4
    Letzter Beitrag: 02.08.03, 12:57