Regulärer Ausdruck

Hi,

also ich muss folgenden Ausdruck (Matlab Code) in einem String entfernen:

Java:
if isempty(var)
*
end

Momentan sieht mein Ausdruck so aus:
Java:
String regex = "if\\sisempty\\("+ s +"\\)\\s.*[\\s]??end";
string = string.replaceFirst(regex, "");

Der Ausdruck muss dabei nicht-gierig sein, da auch die ganze Datei mit einem end aufhört.

Ich finde leider in keinem Tutorial eine Angabe wie ich normale Zeichenfolgen angebe. [ab] bedeutet ja zB a oder b. Ich habe den Code mittlerweile auch hundert mal verändert. Entweder matched der Ausdruck einfach nicht oder ich bekomme in der zweiten Zeile des Codes eine Endlosschleife (oder es dauert einfach nur 10min den Ausdruck zu ersetzen..). Wieso weiß ich nicht. Muss ich eventuell durch Backslashes noch deklarieren welcher Teil des Strings auch wirklich ein regulärer Ausdruck ist ähnlich wie bei PHP?
 
was du machen solltest ist weniger machen,
fange mit einem String "i" an, versuche den zu machten, klappt? dann als nächstes "if", dann Leerzeichen, mehrere Wörter usw.,
nicht alles auf einmal und dann nichts mehr verstehen..,

wenn du an einen bestimmten Punkt angelangst, an dem etwas nicht geht,
dann beschreibe die Situation genau, was geht noch, was geht nicht mehr?

hast du übrigens Zeilenumbrüche in dem String? das ist wieder ein Schritt Komplexität für sich

welchen Zweck haben die zwei ?? hintereinander im Ausdruck?

> Ich finde leider in keinem Tutorial eine Angabe wie ich normale Zeichenfolgen angebe.
ganz normal ohne irgendetwas, hast du ja auch schon mit if am Anfang usw.
 
Hi,

ja das Problem scheinen die Zeilenumbrüche zu sein.

Java:
String s = "w";
String oldS = "if isempty(" + s + ") code end";
System.out.println(oldS);
String regex = "if\\sisempty\\("+ s +"\\).*end";
String newS = oldS.replaceFirst(regex, "ersetzt");
System.out.println(newS);

Das hier funktioniert nämlich. Zwischen der Bedingung und dem end kann natürlich belieber Code stehen und deshalb auch Zeilenumbrüche. Ich bin davon ausgegangen, dass die durch * abgedeckt werden, da das ja ein beliebiges Zeichen ist.

edit: und das zweite ? steht für den nicht-gierigen Operator.
 
hier schonmal ein Beispiel
Java:
public class Test
{
    public static void main(String[] args)
    {
        String oldS = "a\nb";
        System.out.println(oldS);
        Pattern p = Pattern.compile("a\\nb", Pattern.MULTILINE);
        Matcher m = p.matcher(oldS);
        String newS = m.replaceFirst("ersetzt");
        System.out.println("neu: " + newS);
    }
}
für Zeilenumbruch gibts vielleicht eine Zeichengruppe, .* half bei mir bisher nicht
 
Hi,

mit
Java:
String s = "w";
String oldS = "if isempty(" + s + ")\r\ncode\n\r\n\nend hallo end";
System.out.println(oldS);
String regex = "if\\sisempty\\("+ s +"\\)(.|\\s)*?end";
String newS = oldS.replaceFirst(regex, "ersetzt");
System.out.println(newS);

funktioniert es jetzt. Gruppiert man eine Zeichengruppe nicht eigentlich mit eckigen Klammern? Ich hätte jetzt (.|\\s)*? so geschrieben: [.\\s]*? Das hat aber nicht funktioniert.
 
Pattern.DOT_ALL wäre noch das Flag was ich eigentlich suchte, dann ist der Zeilenumbruch bei .* mit drin
 

Zurück
Oben