im String ersetzen, wenn.

Status
Nicht offen für weitere Antworten.

magic_halli

Bekanntes Mitglied
Hi,

ich habe einen String, der in etwa so aussehen kann:
java Code:
Code:
String str = "sigma_v=sqrt(sigma^2+3*tau^2*tau_v)";

Jetzt möchte ich in solch einem String bspw. 'sigma' und 'tau' ersetzen (z.B. durch einen Zahlenwert).
Es soll aber nur ersetzt werden, wenn links vom gefundenen Wort (wäre hier 'sigma' bzw. 'tau') 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' und 'tau' ersetzt werden, aber nicht das sigma von 'sigma_v' und tau von 'tau_v'!
Wie ich ersetze weis ich. Mir geht es nur um das Überprüfen dieser Kriterien... denn ein ersetzen von sigma bzw. tau mittels replaceAll(), ersetzt ja leider auch in den Worten sigma_v und tau_v - das soll aber nicht ersetzt werden.

Wie kann ich das anstellen?

Danke und Gruß.
 
S

SlaterB

Gast
mit regulären Ausdrücken könntest du sowas finden,
aber kaum ersetzen,
immerhin bekommst du den Index des Anfangs und Ende,
dann könntest du damit den Originalstring auftrennen und neu zusammensetzen,

vielleicht kennt noch wer einfacheres/ oder die Ersetzungserweiterung selber bauen ;)
Code:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        String str = "aaaaacdueaaaa";
        String search = "(c|e)(du|da)(c|e)";
        Pattern p = Pattern.compile(search);
        Matcher m = p.matcher(str);
        while (m.find())
        {
            System.out.println("find: "+m.group(1)+", "+m.group(2)+", "+m.group(3));
            System.out.println(m.end(1)+", "+m.start(3));
        }
    }
}
 
S

SlaterB

Gast
ach so gehts:

Code:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        String str = "---cdue--du-";
        str = str.replaceAll("(c|e)(du|da)(c|e)", "$1TTT$3");
        System.out.println(str);
    }
}
 

magic_halli

Bekanntes Mitglied
mit regulären Ausdrücken könntest du sowas finden,
aber kaum ersetzen, ...
Mh, danke erstmal. Das ich kaum ersetzen kann, ist natürlich nicht schön, denn darum gehts mir ja eigentlich. :cry:
Naja, ich werde mal ein wenig probieren - vielleicht fällt ja jemand noch ein Ansatz dazu ein?!
 

fehlerfinder

Bekanntes Mitglied
magic_halli hat gesagt.:
ich habe einen String, der in etwa so aussehen kann:
Sowas habe ich doch neulich schonmal gelesen (siehe: http://www.java-forum.org/de/viewtopic.php?t=58347) ;-)

magic_halli hat gesagt.:
Wie ich ersetze weis ich. Mir geht es nur um das Überprüfen dieser Kriterien... denn ein ersetzen von sigma bzw. tau mittels replaceAll(), ersetzt ja leider auch in den Worten sigma_v und tau_v - das soll aber nicht ersetzt werden.
Dann hilft nur, dein Kriterium für den Vergleich zu erweitern:
Code:
String search = "(c|e)(du|da)(c|e)";

// wird dann zu 

String search1 = "(du|da)[^_]";

siehe auch: java.util.regex

das "Dach" sorgt dafür, dass beim Vergleich nach "du" oder "da" KEIN '_' steht.
 

magic_halli

Bekanntes Mitglied
Code:
String search1 = "(du|da)[^_]";
Wie sieht das syntaktisch aus, wenn ich außer dem '_' auch auf KEINE alphanumerischen Zeichen prüfen will???
Code:
[^\w]
So etwa?

PS: Verstehe ich hier was falsch...?
WEnn ich folgendes schreibe:
Code:
String eingabe = "sigma_v=sqrt(sigma^2+3*tau^2)";
eingabe = eingabe.replaceAll("(sigma)[^_][a-zA-Z0-9]", "xxx");
...dann bedeutet das doch, dass alle 'sigma' im Text ersetzt werden, die KEIN '_' und keine alphanummerischen Zeichen noch hintendran haben,oder?! Also werden sigma_v, sigma2 oder auch sigmaW nicht verändert?!
Frage:
1. Wieso kommt kein '^' bei den alphanummerischen Zeichen davor?
2. Wie sähe die Syntax aus, wenn ich auch VOR dem Suchwort auf diese ganzen Zeichen prüfen möchte?
Code:
String eingabe = "sigma_v=sqrt(sigma^2+3*tau^2)";
eingabe = eingabe.replaceAll("[^_][a-zA-Z0-9](sigma)[^_][a-zA-Z0-9]", "xxx");
So klappts nämlich nicht!
 
S

SlaterB

Gast
> So etwa?

erst testen,
wenn irgendwas komisches rauskommt, dann konkrete Fragen stellen wie im Rest deines Postings

> dann bedeutet das doch, dass alle 'sigma' im Text ersetzt werden, die KEIN '_' und keine alphanummerischen Zeichen noch hintendran haben,oder?!

wieso KEINE alphanummerischen ZeicheN?
von Mehrzahl steht da nix, nur ein Zeichen, und ein ^ fehlt auch, also keine Negation

> 1. Wieso kommt kein '^' bei den alphanummerischen Zeichen davor?

? wenn du ein ^ haben willst, dann schreibe es hin, sonst nicht

> 2. Wie sähe die Syntax aus, wenn ich auch VOR dem Suchwort auf diese ganzen Zeichen prüfen möchte?
> So klappts nämlich nicht!

bitte nochmal ganz langsam in deutscher Sprache was genau gematcht werden soll,
idealerweise mit Positiv- und Negativ-Beispielen
 

fehlerfinder

Bekanntes Mitglied
magic_halli hat gesagt.:
Wie sieht das syntaktisch aus, wenn ich außer dem '_' auch auf KEINE alphanumerischen Zeichen prüfen will???
Code:
[^\w]
So etwa?
Hast du mal die API-Doku zu java.util.regex gelesen??? (Link in meinem letzten Beitrag) Da steht eigentlich alles drin. Eine Auflistung aller möglichen Ausdrücke findest du bei der Klasse "Pattern", aber das war eigentlich klar, oder?

magic_halli hat gesagt.:
PS: Verstehe ich hier was falsch...?
Code:
eingabe = eingabe.replaceAll("(sigma)[^_][a-zA-Z0-9]", "xxx");
Ja...

Jedes Zeichen deines regulären Ausdrucks ist zunächst mal ein Zeichen, welches mit deinem zu testenden String übereinstimmen muss. Mit Hilfe der eckigen Klammern kannst du Gruppen von Zeichen gegen ein einzelnes Zeichen vergleichen, also z.B. [0-9] ist eine der Zahlen 0 bis 9. Jetzt hast du ja schon völlig korrekt [a-zA-Z0-9] geschrieben, allerdings in eine separate Klammer. Du vergleichst also jetzt auf Strings, die im Anschluss an das "sigma" irgendein Zeichen stehen haben, nur keinen Unterstrich. Erst im Anschluss an dieses EINE Zeichen greift dann die o.g. Klammer für die alphanumerischen Ausdrücke.

magic_halli hat gesagt.:
1. Wieso kommt kein '^' bei den alphanummerischen Zeichen davor?
2. Wie sähe die Syntax aus, wenn ich auch VOR dem Suchwort auf diese ganzen Zeichen prüfen möchte?
zu 1.: wer sagt das, dass da kein '^' davor steht???
zu 2.: Der angegebene String ist grundsätzlich so zu verwenden, d.h. genau das Pattern, dass gewünscht oder nicht gewünscht ist, steht auch in deinem Java-Pattern, allerdings solltest du erstmal den ersten Fall (kein '_' und kein alphanum) richtig hinbekommen, bevor du dein Pattern erweiterst.

Reguläre Ausdrücke können durchaus sehr komplex werden und wenn du schon falsch - bzw. nicht getestet (siehe den Beitrag von SlaterB) - anfängst, wird das nix :noe:
 

magic_halli

Bekanntes Mitglied
Ok Leute, sry wenn ich vorhin etwas wirr gepostet habe :oops:

Also, API zu java.util.regex hab ich gelesen und vor mir liegen.
Ich habe nun folgendes probiert:
Code:
String eingabe = "sigma_v=sqrt(sigma^2+3*tau^2)";
eingabe = eingabe.replaceAll("(sigma)[^_a-zA-Z0-9]", "XXX");
System.out.println(eingabe);
Ausgabe:
Code:
sigma_v=sqrt(XXX2+3*tau^2)
Falsch, denn das '^' nach sigma wird mit ersetzt! Jedoch richtig insofern, als dass das sigma_v so bleibt wie´s ist.

In Worten heißt das doch bei mir: "Ersetze sigma, wenn das nachfolgende Zeichen KEIN (^ entspricht Negation) '_' oder Zahlen, oder Buchstaben ist"?!

Wenn ich jetzt folgenden Eingangsstring habe:
Code:
String eingabe = "sigma_v=sqrt(sigma(tau)^2+3*tau^2)";
eingabe = eingabe.replaceAll("(sigma)[^_a-zA-Z0-9]", "XXX");
System.out.println(eingabe);
Ausgabe:
Code:
sigma_v=sqrt(XXXtau)^2+3*tau^2)
Da wird sigma ersetzt, aber die Klammer gleich mit weggemacht!

Omg, mir qualmt der Schädel bei diesen RegularExpressions. Was mache ich denn nur falsch - ich stell mich aber auch wieder an?! :autsch:
 
S

SlaterB

Gast
du hast den String sigma^, der auf dein Suchschema passt,
dieser String wird also durch XXX ersetzt (der ganze String, nicht nur ein bisschen davon), was könnte es einfacheres geben ;)

wie man dafür sorgt, dass sowohl gesucht wird, aber die umgebenden Zeichen erhalten bleiben,
das hatten wir doch anfangs geklärt:

String str = "---cdue--du-";
str = str.replaceAll("(c|e)(du|da)(c|e)", "$1TTT$3");


willst du damit noch selber probieren oder ohne jede Ahnung auf eine Lösung warten? ;)
 

magic_halli

Bekanntes Mitglied
Naja, es wäre echt toll, wenn ich die Lösung selber finden würde! :roll: Ich tue mir hierbei zwar schwer, aber so denke ich, lerne ich auch was dabei?!

Nur nochmal für mich zur Erklärung...
Code:
String str = "---cdue--du-";
str = str.replaceAll("(c|e)(du|da)(c|e)", "$1TTT$3");
Das heißt, dass wenn ein 'du' oder 'da' im STring vorkommt und davor UND dahinter ein 'c' oder 'e' vorkommt, erst dann wird du oder da durch TTT ersetzt. $1 ist hierbei der Platzhalter für das erste (c|e) und $3 für das nachfolgende (c|e) bzw. eben den Klammerausdruck, wie auch immer der heisen mag.
Hab ich das richtig verstanden?
 
S

SlaterB

Gast
ja,
das kompliziert (du|da) in der Mitte kann einfacher nur ein String sein,
du willst in einem replaceAll ja immer nur genau ein Element wie 'sigma' ersetzen
 

magic_halli

Bekanntes Mitglied
Ok, ich kann in der mittleren Klammer auch mein sigma einsetzen... soweit verstanden.
Jezt hab ich versucht, nicht auf c oder e zu prüfen, sondern auf irgendwelche Sonderzeichen, bspw:
Code:
String str = "---^du^--du-";
str = str.replaceAll("(^)(du|da)(^)", "$1TTT$3");
Ausgabe:
Code:
---^du^--du-

So und hier bin ich mit der Logik schon wieder am Ende - warum das denn - ob nun Buchstabe oder Zeichen... ist das nicht egal bzw. ist meine Syntax falsch?
 
S

SlaterB

Gast
^ steht für den Anfang einer Zeile

nach einen Buchstaben kann nie der Anfang einer Zeile kommen, da kommt immer erst das Zeilenende,

mit viel Umbau funktioniert
Code:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        String str = "du\n--du-";
        Pattern p = Pattern.compile("(^)(du|da)($)",Pattern.MULTILINE);
        Matcher m = p.matcher(str);
        str = m.replaceAll("$1TTT$3");
        System.out.println(str);
    }
}

aber du wolltest doch was ganz anderes oder? ;)
 

magic_halli

Bekanntes Mitglied
aber du wolltest doch was ganz anderes oder?
Naja, eigentlich wollte ich das sigma ersetzen... schon richtig, aber weiterführend muss ich ja noch abfangen, wie reagiert werden soll, wenn irgendwelche anderen Zeichen (Klammern, ^, *, +, -, / etc vorkommen). Denn ich habe ja gesehen, dass wenn ich es so mache:
Code:
String eingabe = "sigma_v=sqrt(sigma^2+3*tau^2)";
eingabe = eingabe.replaceAll("(sigma)[^_a-zA-Z0-9]", "XXX");
System.out.println(eingabe);
...kommt als Ausgabe:
Code:
sigma_v=sqrt(XXX2+3*tau^2)

und wie Du schon richtig gesagt hast:
wie man dafür sorgt, dass sowohl gesucht wird, aber die umgebenden Zeichen erhalten bleiben,
das hatten wir doch anfangs geklärt:

String str = "---cdue--du-";
str = str.replaceAll("(c|e)(du|da)(c|e)", "$1TTT$3");

Mh, und damit schließt sich wieder der Kreis. :wink:


^ steht für den Anfang einer Zeile
Kann man hierfür nicht irgendwie einen entsprechende Hexwert für das Zeichen einsetzen oder sonstwie auflösen?
In der API steht bspw: " A next-line character ('\u0085')" ... gibts für das '^' nicht auch solch eine Notation? Was ist das überhaupt für eine Notation?
 

fehlerfinder

Bekanntes Mitglied
magic_halli hat gesagt.:
Code:
str = str.replaceAll("(^)(du|da)(^)", "$1TTT$3");
ist meine Syntax falsch?
Wenn du auf das Zeichen '^' vergleichen willst, musst du ein "\\^" in dein Pattern einbauen. Einen "\" benötigst du, um im regulären Ausdruck (also völlig unabhängig von Java) das ^ zu "escapen" (ihm die Sonderzeichenbedeutung zu nehmen) und zwei "\\" müssen es sein, weil Java an sich schon einen "\" als Escape-Zeichen verwendet und diesen dann bei der Auflösung des Patterns herausfiltern würde.
 

magic_halli

Bekanntes Mitglied
Code:
String str = "---^du^--du-";
str = str.replaceAll("(\\^)(du|da)(\\^)", "$1TTT$3");
Ausgabe:
Code:
---^TTT^--du-
Jawohl, so klappt das schonmal :wink:

So, na und nun weiter im Programm...
 

magic_halli

Bekanntes Mitglied
So, ich mal wieder :oops:

Also irgendwie haben diese RegEx es ganz schön in sich!!!
Folgendes habe ich gemacht:
Code:
String eingabe = "sigma_v=sqrt(sigma(sigma)^2+3*tau^2)";
eingabe = eingabe.replaceAll("(\\( | \\^ | \\))(sigma)[^_a-zA-Z0-9](\\^ | \\( | \\))", "$1XXX$3");
System.out.println(eingabe);
Ausgabe: sigma_v=sqrt(sigma(sigma)^2+3*tau^2) (also gar nix ersetzt!)

Vielleicht kann mir doch mal jemand für meine Vorstellung helfen, wie es syntaktisch aussehen muss?!
Es soll nur mein sigma ersetzt werden und alle direkt davor und danach angrenzenden Zeichen sollen nicht verändert werden (Klammern, ^ und dann später noch Rechenzeichen). Weiterhin soll auch nur dann ersetzt werden, wenn das nächste Zeichen, welches nach sigma kommt, kein'_', Zahl oder Buchstabe ist.

Ich habe jetzt schon tausende Kombinationen versucht und es kommen immer irgendwelche Ergebnisse heraus, aber keines ist korrekt. Ich bin hier echt langsam am durchdrehen... wieso will das nicht?! :bahnhof: :bahnhof: :bahnhof:
 

fehlerfinder

Bekanntes Mitglied
magic_halli hat gesagt.:
Code:
eingabe = eingabe.replaceAll("(\\( | \\^ | \\))(sigma)[^_a-zA-Z0-9](\\^ | \\( | \\))", "$1XXX$3");
Leerzeichen sind ja immer ganz gut für die Übersicht, aber in einem regulären Ausdruck haben sie nichts zu suchen - AUSSER, wenn du wirklich mit einem Leerzeichen vergleichen willst. Denke immer daran: der reguläre Ausdruck ist eine exakte Repräsentation deines/r Strings, bloß in einer "Formel-Sprache" (ein anderer Begriff fällt mir jetzt nicht ein ;-) ).

Richtig wäre also (ohne jetzt alles im Einzelnen geprüft zu haben)
Code:
eingabe = eingabe.replaceAll("(\\(|\\^|\\))(sigma)[^_a-zA-Z0-9](\\^|\\(|\\))", "$1XXX$3");
 
S

SlaterB

Gast
Vorsicht mit den Leerzeichen, die zählen auch
\\( |
heißt: (Klammer und Leerzeichen) oder was anderes

an Stelle der | oder verwende doch [] zur Auflistung von Alternativen
Code:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        String eingabe = "sigma_v=sqrt(sigma(sigma)^2+3*tau^2)"; 
        String part1 = "[\\(\\^\\)]";
        eingabe = eingabe.replaceAll("("+part1+")(sigma)([^a-zA-Z0-9]"+part1+")", "$1XXX$3"); 
        System.out.println(eingabe); 
    }
}

bedenke aber, dass bei
(sigma)^2
die ) schon als [^_a-zA-Z0-9] zählt, nicht als der Teil dahinter (part1),
das funktioniert also nur weil hinter ) noch ein ^ folgt

für das zweite sigma im String funktioniert das also nicht,

---------

wenn man das Pattern verkleinert auf
Code:
eingabe = eingabe.replaceAll("("+part1+")(sigma)([^a-zA-Z0-9])", "$1XXX$3");
so wird nun zwar das zweite sigma ersetzt, aber das dritte nicht mehr,
ich nehme an, weil der Buchstabe zwischen zweiten und dritten sigma für das zweite sigma verwendet wurde und nicht mehr zur Verfügung steht,
was man da nun normalerweise tun könnte weiß ich auch nicht mehr,

generell könnte man sich überlegen, für welche Zeichen dies zutrifft,
und diese Zeichen vor dem ersetzen verdoppeln:

Code:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        String eingabe = "sigma_v=sqrt(sigma(sigma)+3*tau^2)";
        String part1 = "[\\(\\^\\)]";


        eingabe = eingabe.replaceAll("(" + part1 + ")", "$1$1");
        System.out.println(eingabe);
        eingabe = eingabe.replaceAll("(" + part1 + ")(sigma)([^a-zA-Z0-9])", "$1XXX$3");
        System.out.println(eingabe);

        eingabe = eingabe.replaceAll("(" + part1 + "){2}", "$1");
        System.out.println(eingabe);
    }
}
das verdoppeln geht gut, beim zurückkürzen bin ich mir mit meinem Pattern nicht so sicher,
notfalls per Hand
eingabe = eingabe.replaceAll("\\(\\(", "\\(");
eingabe = eingabe.replaceAll("\\)\\)", "\\)");
usw.

wobei das ganze Verfahren (das Verdoppeln) nicht gerade schön ist ;)
 

magic_halli

Bekanntes Mitglied
Vielen Dank erstmal für euer Bemühen! :applaus:

bedenke aber, dass bei
(sigma)^2
die ) schon als [^_a-zA-Z0-9] zählt,
Allerdings fällt doch die Klammer ) eigentlich gar nicht in das Muster rein?!
Omg, ich hasse RegEx... da bin ich mir sicher! :roll:

Ich merke schon, es ist wahrscheinlich gar nicht möglich, einen allgemeinen Algorithmus zu entwerfen, der sämtliche Eventualitäten für einen Eingabestring abdenken kann, oder?
 
S

SlaterB

Gast
> Allerdings fällt doch die Klammer ) eigentlich gar nicht in das Muster rein?!

wieso nicht?
was ist denn das Muster, warum sollte es nicht ) beeinhalten?

> Ich merke schon, es ist wahrscheinlich gar nicht möglich, einen allgemeinen Algorithmus zu entwerfen, der sämtliche Eventualitäten für einen Eingabestring abdenken kann, oder?

solange du nicht alle nennst ist das schwer zu sagen
 

magic_halli

Bekanntes Mitglied
solange du nicht alle nennst ist das schwer zu sagen
Tja, wie Du sicher gemerkt hast, handelt es sich um eine Formel. Diese Formel kommt aus einem Textfile, in dem ich zeilenweise diesen RegEx anwenden will, um darin enthaltene Worte durch konkrete Zahlenwerte zu ersetzen.
Die Formeln können hierbei alle möglichen sein, denn dieses File kommt aus einem techn. Konstruktionsprogramm und da können teilweise auch krasse Dinger dabei sein. Das weiß ich aber als Programmierer vorher leider nicht! :cry:

Dein Mechanismus mit dem Verdoppeln funktioniert aber erstmal - ich habe in part1 noch weitere Zeichen aufgenommen - sieht bis jetzt gut aus. :applaus:
 

fehlerfinder

Bekanntes Mitglied
magic_halli hat gesagt.:
Diese Formel kommt aus einem Textfile
Wie du in einem anderen Beitrag schreibst, wird die einzulesende Textdatei mehrfach durchlaufen und immer das, was schon ausgerechnet ist, durch seinen Zahlenwert ersetzt. Das läuft nun so lange, bis nichts mehr zu ersetzen ist, sehe ich das richtig?

Damit das funktioniert, musst du ja ohnehin die Textdatei immer wieder schreiben. Hier nochmal dein Beispiel aus o.g Thread:

Code:
sigma = (1.0/5.0 + 2.0/6.0 + 10.0/4.0) 
tau = (3.0/7.0 + 8.0/4.0 + 9.0/4.0) 
sigma_v=sqrt(sigma^2+3*tau^2) 
s_b=4.0/sigma_v 
s_bv=6.0/sigma_v

Du könntest jetzt beim allerersten Einlesen der Datei eine Ersetzungstabelle, z.B. ein Hashtable erzeugen, in dem du jedem String der Eingabedatei einen eindeutigen String für die Ausgabedatei zuordnest

Code:
Hashtable<String, String> referenz = new Hashtable<String, String>();
// Code, um die Strings zu ermitteln, nachfolgend mal eine manuelle Abkürzung
int unique = 0;
String key = "sigma";
String value = "var" + unique;
referenz.put(key, value);
unique++;

Vor dem .put(...) musst du natürlich erstmal überprüfen, ob genau dieser String schon enthalten ist. Um jetzt deine key-Werte zu erhalten, musst du natürlich auch weiterhin irgendwelche Annahmen treffen, welche Zeichen solch ein key haben darf, also z.B. a-z, A-Z, 0-9, _ - Wenn du davon ausgehtst, dass jede Zeile mit einem key anfängt, verarbeitest du einfach(?) zeichenweise deine Eingabezeilen vom Zeilenanfang bis zum ersten Zeichen, das nicht zum erlaubten Zeichenvorrat gehört. Das kommt dann in den/die(?) Hashtable und wird auch gleich an Ort und Stelle ersetzt - aber NUR an dieser einen Stelle.

Weiter geht's: weitere Zeichen werden eingelesen und irgendwann triffst du wieder auf ein für einen key erlaubtes Zeichen. Vermutlich ist auch die Einschränkung erlaubt, dass ein key mit einem Buchstaben beginnt - sonst wird's irgendwann tatsächlich völlig unmöglich.

Jeder gefundene key wird auf Vorhandensein im Hash überprüft und ggf. sofort ersetzt - wieder nur an dieser einen Stelle, denn dann hast du Anfangs- und Endindex innerhalb der Zeile.

Wenn das so funktionieren sollte (ist nur theoretisch überlegt), benötigst du nicht einmal reguläre Ausdrücke - obwohl es auf gar keinen Fall verkehrt ist, die Grundzüge zu kennen ;-)
 

magic_halli

Bekanntes Mitglied
@fehlerfinder:
Vielen Dank für den Vorschlag... ich werde ihn mir mal gründlich zu Gemühte führen! :###

@SlaterB:
Ich bin nochmals an Deinem RegEx-Mechanismus dran:
Code:
String eingabe = "sigma_v=sqrt(sigma(sigma)+3*tau^2)";
String part1 = "[\\(\\^\\)]";

//1.
eingabe = eingabe.replaceAll("(" + part1 + ")", "$1$1");
System.out.println(eingabe);
//2.
eingabe = eingabe.replaceAll("(" + part1 + ")(sigma)([^a-zA-Z0-9])", "$1XXX$3");
System.out.println(eingabe);
//3.
eingabe = eingabe.replaceAll("(" + part1 + "){2}", "$1");
Es klappt zwar erstmal, doch je öfter ich mir den Code anschaue, umso unklarer wird mir das Prinzip - bezüglich der Syntax.
Kann mir mal jemand zu 1., 2. und 3. in Worten sagen, was passiert?! Mir ist irgendwie die syntaktische schreibweise nich so ganz einleuchtend, vor allem bezüglich 'part1'. :oops:


Gruß
 
S

SlaterB

Gast
part 1 ist nur di Menge der Zeichen, steht nur in einer Variablen, um sie nicht imer wieder zu tippen
(Tippfehler, eine Stelle vergessen, mühsam vergleichen usw.)

1 sucht ein derartiges Zeichen und schreibt es zweimal zurück

3. sucht zwei solche Zeichen und schreibt das erste davon zurück,
da sicher ist, dass jeweils zwei hintereinander kommen, kann es keine Probleme geben,
allgemein würde aber auch (^ zu ( gekürzt werden

was 2. macht wiederhole ich nicht..
 

magic_halli

Bekanntes Mitglied
Aaaah, alles klar. Danke. So hatte ich mir das auch gedacht (weil ja so besprochen), aber die Syntax hat mich zeitweilig verwirrt. :roll:

Eine Sache habe ich noch als Frage, wo ich nun bereits ne Weile grübel...
Ich bekomme es nicht hin, auch das Wort (sigma) links vom '=' zu ersetzen. Ausgangspunkt ist hierbei wieder SlaterB´s Code mit folgendem eingabe-STring:
Code:
String eingabe = "sigma=sqrt(sigma(sigma)+3*tau^2)";
String part1 = "[\\(\\^\\)]";

eingabe = eingabe.replaceAll("(" + part1 + ")", "$1$1");
System.out.println(eingabe);

eingabe = eingabe.replaceAll("(" + part1 + ")(sigma)([^a-zA-Z0-9])", "$1XXX$3");
System.out.println(eingabe);

eingabe = eingabe.replaceAll("(" + part1 + "){2}", "$1");
System.out.println(eingabe);


Ich hab schon wieder die wildesten Modifikationen gemacht, aber nichts fruchtet. Ersetzt werden jedoch immer nur die sigma in der Gleichung, jedoch nicht vorm '='!


PS: Mir ist klar, dass die Formel Null Sinn ergibt, aber es geht hier um´s Prinzip.
 
S

SlaterB

Gast
welche Modifikationen hast du denn konkret gemacht?
ich sehe weder, wie du den Zeilenanfang noch das =-Zeichen miteinbeziehst,
sind doch einfache Schritte

Code:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        String eingabe = "sigma=sqrt(sigma(sigma)+3*tau^2)"; 
        String part1 = "[\\(\\^\\)=]"; 

        eingabe = eingabe.replaceAll("(" + part1 + ")", "$1$1"); 
        System.out.println(eingabe); 

        eingabe = eingabe.replaceAll("(^|"+part1+")(sigma)([^a-zA-Z0-9])", "$1XXX$3"); 
        System.out.println(eingabe); 

        eingabe = eingabe.replaceAll("(" + part1 + "){2}", "$1"); 
        System.out.println(eingabe); 

    }
}
 

magic_halli

Bekanntes Mitglied
...ich habe mal hier, mal da was probiert, doch so hatte ich es nicht gemacht: ( ^| eingefügt )
Code:
eingabe = eingabe.replaceAll("(^|"+part1+")(sigma)([^a-zA-Z0-9])", "$1XXX$3");

Danke.
 

magic_halli

Bekanntes Mitglied
Nach einiger Zeit bin ich nochmal mit dem Thema "im String ersetzen" beschäftigt. Der Code, der hier in dem Post herausgearbeitet wurde, um mein ursprüngliches Problem zu lösen (ersetzen von bestimmten Teilstrings rechts vom Gleichheitszeichen in einem String, welcher eine math.Formel darstellt) funktioniert erstmal prima!
So sieht er aus:
Code:
String eingabe = "sigma=sigma_v/sigma_v+2*3/4-5^6";
String part1 = "[\\(\\^\\)\\*\\ \\/\\+\\-\\=\\>\\<]";

eingabe = eingabe.replaceAll("(" + part1 + ")", "$1$1");
System.out.println(eingabe);
eingabe = eingabe.replaceAll("(^|" + part1 + ")(sigma_v)([^_a-zA-Z0-9=]|$)", "$1XXX$3");
System.out.println(eingabe);
eingabe = eingabe.replaceAll("(" + part1 + "){2}", "$1");
System.out.println(eingabe);

Diesen Code wollte ich nun so umschreiben, damit in einem String, der einen math. Vergleich darstellt, z.B.:
sigma_v>5 oder
sigma_v<5 oder
sigma_v=5 oder
sigma_v!=5 oder
sigma_v>=5 oder
sigma_v<=5
NUR die linke Seite von den Vergleichsoperatoren, also hier sigma_v, durch einen bestimmten Wert ersetzt wird!
Ich bastel nun bereits ne Stunde hier dran rum, ohne jedoch das gewünschte Ergebnis zu erhalten. Immer passiert etwas anderes, aber meinem Ziel komme ich einfach nicht näher. :cry:
Dieser Code scheint schon erstmal halbwegs für die "neuen" Eingabestrings zu funktionieren, doch wenn der Eingabestring 'sigma_v=5' lautet, wird sigma_v einfach nicht ersetzt!!!
Kann mir bitte bitte jemand mal dabei zur Hand gehen, damit von solch einem String nur die linke Seite vom Vergleichsoperator ersetzt wird.

Vielen Dank.


PS: Ich mag RegExp nicht wirklich und tu mir hierbei immer wieder schwer - vor allem die Syntax präge ich mir nicht so recht ein - bin jedoch gewillt das endlich mal richtig zu raffen! :wink:
 
S

SlaterB

Gast
Code:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        String eingabe = "sigma_v>=";
        String gleichung = "(\\=|!\\=|\\<|\\>)";
        eingabe = eingabe.replaceAll("sigma_v" + gleichung, "DDD$1");
        System.out.println(eingabe);
    }
}
 
S

SlaterB

Gast
das ist ja auch nur die erste Mini-Version aus deiner ungenauen Beschreibung,
gleich wirst du wieder mit 'aber bei ..' kommen..
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C In String, Buchstaben ersetzen durch andere Buchstaben Java Basics - Anfänger-Themen 26
I String ersetzen, der Inhalt enthält Java Basics - Anfänger-Themen 4
S Ersetzen eines Asterix in einem String Java Basics - Anfänger-Themen 8
C char in String suchen und durch anderen String ersetzen Java Basics - Anfänger-Themen 2
Alex/89 String in einer txt ersetzen Java Basics - Anfänger-Themen 15
Ananaskirsche Input/Output Platzhalter durch String in yml-Datein ersetzen Java Basics - Anfänger-Themen 5
J Input/Output String Suchen und Ersetzen Java Basics - Anfänger-Themen 8
L Wort in String ersetzen Java Basics - Anfänger-Themen 11
G String ersetzen Java Basics - Anfänger-Themen 5
X String einzelne Buchstaben ersetzen Java Basics - Anfänger-Themen 4
A String ersetzen Java Basics - Anfänger-Themen 6
B Char in String ersetzen Java Basics - Anfänger-Themen 15
A Vokale im String ersetzen Java Basics - Anfänger-Themen 12
D Datentypen String Inhalte ersetzen Java Basics - Anfänger-Themen 8
G Enter-Zeichen aus String ersetzen Java Basics - Anfänger-Themen 5
G String Suchen ersetzen replace_all() Java Basics - Anfänger-Themen 6
K String ersetzen Java Basics - Anfänger-Themen 10
G Zeilenumbrüche in String durch <br> ersetzen? Java Basics - Anfänger-Themen 3
H String und HEX-Werte ersetzen Java Basics - Anfänger-Themen 8
G REGEX - * durch String ersetzen Java Basics - Anfänger-Themen 3
H string ersetzen. Java Basics - Anfänger-Themen 8
F Zeichen in String ersetzen mit 1.3 Java Basics - Anfänger-Themen 9
J String Array[] ersetzen Java Basics - Anfänger-Themen 2
T Substrings in Strings ersetzen ohne java.lang.String Java Basics - Anfänger-Themen 8
J Datei öffnen und String durch einen anderen String ersetzen. Java Basics - Anfänger-Themen 15
G String ersetzen Java Basics - Anfänger-Themen 5
N String nach Zeichen ersetzen Java Basics - Anfänger-Themen 6
J String in StringBuffer ersetzen Java Basics - Anfänger-Themen 7
G String: nach 3. Zeichen char ersetzen Java Basics - Anfänger-Themen 3
D ersetzen eines Buchstaben durch mehrere in String Java Basics - Anfänger-Themen 8
C Textdatei öffnen, String suchen, String ersetzen ????????? Java Basics - Anfänger-Themen 6
D String Groß/Kleinschreibung Ignorieren Java Basics - Anfänger-Themen 4
D Map<String, Integer> sortieren und der reinfolge nach die Glieder abfragen Java Basics - Anfänger-Themen 3
J Ähnlichen String in Liste finden Java Basics - Anfänger-Themen 6
Kartoffel_1 String transformation Java Basics - Anfänger-Themen 7
H String-Operation replace() - Zeichenkette verdoppeln Java Basics - Anfänger-Themen 2
K String analysieren Java Basics - Anfänger-Themen 27
Beowend String zu Date parsen Java Basics - Anfänger-Themen 1
Beowend String auf Satzzeichen überprüfen? Java Basics - Anfänger-Themen 6
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
String in ArrayList umwandeln Java Basics - Anfänger-Themen 1
I Sass Compiler und String erhalten? Java Basics - Anfänger-Themen 7
Avalon String in Double bzw. Währung konvertieren Java Basics - Anfänger-Themen 6
T Methode akzeptiert String nicht Java Basics - Anfänger-Themen 18
F Arraylist<String>Ein Wort pro Zeile Java Basics - Anfänger-Themen 6
J Schlüsselworte Prüfen, ob ein bestimmtes, ganzes Wort in einem String enthalten ist. Java Basics - Anfänger-Themen 6
N String überprüfen Java Basics - Anfänger-Themen 3
E String zerlegen aus args Java Basics - Anfänger-Themen 1
M Long-Typ in String-Änderung führt zu keinem Ergebnis bei großer Zahl Java Basics - Anfänger-Themen 11
Ostkreuz String Exception Java Basics - Anfänger-Themen 8
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
J String Filter Java Basics - Anfänger-Themen 5
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Größter zusammenhängender Block gleicher Zeichen im String Java Basics - Anfänger-Themen 1
XWing Randomizer mit einem String Java Basics - Anfänger-Themen 2
D 2D Char Array into String Java Basics - Anfänger-Themen 2
H Cast von Float nach String klappt nicht Java Basics - Anfänger-Themen 12
I Zerlegen von String Java Basics - Anfänger-Themen 3
B Beliebiger String gegeben Suche Datum in String Java Basics - Anfänger-Themen 6
I String Java Basics - Anfänger-Themen 4
I API - zurückgegebener JSON String lesen und in Entity konvertieren Java Basics - Anfänger-Themen 2
H Zu langen String aufteilen - bequeme Methode? Java Basics - Anfänger-Themen 14
W String einer Textdatei in einzelne Stringobjekte pro Zeile aufteilen Java Basics - Anfänger-Themen 14
belana wie am besten 2D Array von String to Integer Java Basics - Anfänger-Themen 18
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
M Kommandozeilenparamter als EINEN String werten Java Basics - Anfänger-Themen 5
M RandomAccessFile int und String gleichzeitig in einer Datei Java Basics - Anfänger-Themen 49
M Prüfen on eine Zahl im String enthalten ist Java Basics - Anfänger-Themen 3
Distanz zwischen zwei Zeichenfolgen in einem String bestimmen Java Basics - Anfänger-Themen 5
Substring in einem String finden Java Basics - Anfänger-Themen 13
BeginnerJava String mit vorgegebener Länge und Buchstaben erzeugen/ mit Leerstellen Java Basics - Anfänger-Themen 8
I Eindeutiger String mit maximaler Anzahl an Zeichen Java Basics - Anfänger-Themen 11
H Interface Wieso "List<String> list = new ArrayList<>[…]" Java Basics - Anfänger-Themen 4
JavaBeginner22 Integer in String umwandeln Java Basics - Anfänger-Themen 7
HolyFUT JSON String in Java Object schreiben - Anführungszeichen rauskriegen? Java Basics - Anfänger-Themen 17
Fodoboo131 RegEx- Umwandlung von String in ausführbares Objekt/ Befehl Java Basics - Anfänger-Themen 9
HolyFUT Input/Output Leerzeichen aus String entfernen - klappt nicht! Java Basics - Anfänger-Themen 13
viktor1 Methoden Methode schreiben static void readText (String filename) {...} zu WordHistogramSample.java Java Basics - Anfänger-Themen 13
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
G Position einer unbekannten 3-stelligen-Zahl in einem String finden Java Basics - Anfänger-Themen 15
T String Array Fehler beim Index Java Basics - Anfänger-Themen 3
H Erste Schritte Nach einer Zahl n soll n Mal der String untereinander ausgegeben werden Java Basics - Anfänger-Themen 3
X Datentypen String.equals funktioniert nicht Java Basics - Anfänger-Themen 5
Alen123 String wiederholen mit Schleifen Java Basics - Anfänger-Themen 1
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
T String splitten Java Basics - Anfänger-Themen 3
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Datentypen String in File konvertieren funktioniert nicht Java Basics - Anfänger-Themen 4
T Platzhalter in String? Java Basics - Anfänger-Themen 14
M String mit Variable vergleichen Java Basics - Anfänger-Themen 9
I String Kombination erstellen anhand fortlaufender Zahl (Vertragsnummer) Java Basics - Anfänger-Themen 13
Fats Waller Compiler-Fehler Kann ich einen String und die Summe zweier Char Werte mittels der println Anweisung ausgeben Java Basics - Anfänger-Themen 4
M Wie kann eine Methode (string) eine andere Methode (void) mit zufälligen int-Werten aufrufen? Java Basics - Anfänger-Themen 4
P9cman Vokale in einem String überprüfen mittels Rekursion Java Basics - Anfänger-Themen 8
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5
R Ein Multidimensionales String Array initialisieren und Deklarieren Java Basics - Anfänger-Themen 2
H String Repräsentation eines Rechtecks mit Instanz-Methode Java Basics - Anfänger-Themen 8
Dorfschmied Kartesisches Produkt von zwei Liste mit Hashmaps<String,String> erstellen Java Basics - Anfänger-Themen 4
S String mit Int input vergleichen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben