ERLEDIGT
NEIN
NEIN
ANTWORTEN
15
15
ZUGRIFFE
1953
1953
EMPFEHLEN
-
02.11.07 15:00 #1
- Registriert seit
- Jun 2003
- Beiträge
- 221
Hi,
ich habe einen String, der in etwa so aussehen kann:
Jetzt möchte ich in solch einem String bspw. 'sigma' ersetzen (z.B. durch einen Zahlenwert).Code java:1
String str = "sigma_v=sqrt(sigma^2+3*tau^2)";
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ß.
-
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.
-
02.11.07 15:41 #3Tobias Köhler Tutorials.de Gastzugang
Noch ein Tipp wäre wenn du dir die Methoden indexOf und substring anguckst
-
02.11.07 15:50 #4
- Registriert seit
- Jun 2003
- Beiträge
- 221
Ok, danke für den Tip mit dem StringTokenizer... ich werd mich mal ransetzen und probieren.
-
05.11.07 10:42 #5
- 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ß.
-
05.11.07 10:45 #6Tobias 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
-
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:
Wobei das Leerzeichen beim Tokenizer ja wegfällt........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
-
05.11.07 12:29 #8
- Registriert seit
- Jun 2003
- Beiträge
- 221
Wie prüfe ich das ab, ob es NUR mit sigma gefüllt ist?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.
-
05.11.07 14:17 #9
- 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.
-
Du koenntest alle tokens in ein Array schreiben und dann gezielt auf eins zugreifen.
-
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)
-
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)); } }
-
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.
-
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.
-
05.11.07 23:01 #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ß TomJava 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
-
Zeilenumbrüche ersetzen, außer wenn <table>
Von crsakawolf im Forum ASPAntworten: 0Letzter Beitrag: 22.01.10, 11:15 -
mysql Abfrage wenn vohanden, dann ersetzen
Von Delta-787 im Forum PHPAntworten: 24Letzter Beitrag: 24.05.09, 22:43 -
Text ersetzen wenn...
Von Katharsis Freak im Forum Linux & UnixAntworten: 2Letzter Beitrag: 25.06.08, 06:07 -
String -> InputStream und wenn sich der String ändert?
Von nFiniteFX im Forum JavaAntworten: 4Letzter Beitrag: 03.07.07, 14:19 -
Wenn strlen($string) > 3500 $string auf $laenge kürzen und ... anhängen
Von SuperUser im Forum PHPAntworten: 4Letzter Beitrag: 02.08.03, 12:57





Zitieren

Login





