Regulären Ausdruck über mehrerer Zeilen finden

Hallo, ich hab nach dem Thema gesucht, aber finde nichts gescheites. Ich möchte einen regulären Ausdruck über mehrere Zeilen. Dazu hab ich an
^ und $ gedacht [das €-Zeichen ist auch wirklich ein €-Zeichen], aber nichts scheint zu funktionieren / matchen:

"
+ "\"Zwischenzeile\"
"
+ "(\\d+) % Prozent
"
+ " €(\\d+,\\d+)"
  // 3 matching groups```

Bitte helft. :/

wie wäre es, erstmal mit EINEM Zeilenumbruch klein anzufangen?
und natürlich keinerlei Code oder Beispiel,
wie so oft das ideale Beispiel wie man eine Frage nicht stellen soll

natürlich funktioniert alles bestens:

    public static void main(String[] args)  {
        String regex = "(\\d+) Essen
" 
                 + "\"Zwischenzeile";
        Pattern p = Pattern.compile(regex);

        String st = "abc 244 Essen
\"Zwischenzeile weiter";
        Matcher m = p.matcher(st);
        if (m.find())
        {
            System.out.println("gefunden");
            System.out.println(m.group());
            System.out.println("-----------------");
            System.out.println(m.group(1));
        }
    }
}

Ja, so ganz ohne Beispielcode und auch Beispieldaten ist es unklar, wie man hier zur besten Lösung gelangt. Deswegen nur ein paar allgemeine Hinweise:

  1. Überlege, ob im Pattern wirklich Line-Terminators sein müssen. Es vereinfacht einiges, wenn man die als einfache Whitespaces behandelt.
    2.) Unbedingt das hier lesen: Pattern (Java Platform SE 7 ) Insbesondere die Einstellungen zu Multiline und zu Line-Terminators. (Evtl. Daten aus Windows mit
    als Zeilentrenner? Im Regex nur
    oder umgekehrt? Siehe dazu auch Tipp aus 1.)
    3.) Lies dir 2. nochmal durch und nochmal und nochmal… (Ich kann garnicht mehr zählen, wie oft ich selbst da schon reingeschaut habe/reinschauen musste.)

Der Beispieltext sieht so aus:

521 Essen
"Zwischenzeile"
50 % Prozent
 €1,23

Leerzeichen + Eurozeichen (aber dann KEIN Leerzeichen) in der letzten Zeile

Wie schon @SlaterB und @nillehammer geschrieben haben, fehlt bei Deinen Posts der Code, also was funktioniert nicht, was hast du probiert, hast du dir das Beispiel welches @SlaterB gepostet hat schon mal angeschaut und den Link den dir @nillehammer gepostet hat?
Wie liest du den Text ein (aus einer Datei, aus der Konsole,…) wäre ersichtlich wenn das in deinem Beispielcode zu sehen wäre (leider hast du ja keinen dazu gepostet)

Richtigstellung: Code von Slater hatte ich bereits ausprobiert, die Tutorials / HowTos zu RegEx kenne ich auswendig, wenn mit auswendig gemeint ist, sie frei zu übersetzen.

Ich probiere mal:
\r vielleicht hab ich Glück.

Wahrhaftig gesagt weiß ich nicht, woher der mit RegEx / Matcher zu untersuchende String kommt - klingt verrückt, ist aber so. Ein SSCCE kann ich später schreiben, obwohl man daran nix sieht.

verrücktes kannst du dir ausdenken, die Logik aber nicht besiegen:
wenn du mit Java-Code Macht über diesen ominösen Götter-String hast, kannst du ihn auch char-weise ausgeben zur Untersuchung,
ihn solange mit einem anderen direkt eingetippten und ständig angepassten String vergleichen bis equals = true herauskommt,

dann ist er eindeutig gefunden und danach kann mit sauberen normalen String weitergemacht werden,
vorher (vor vollständigen Testprogramm) besser gar nicht ins Forum kommen,
als vollkommender Anfänger noch verständlich, aber so willst du ja sicher nicht gelten und 750 Postings sprechen auch was anderes,
Stand 0 wäre wohl besser…

man muss nur arbeiten, es ist alles simpel

Fakt ist dass es bei String und RegEx fast keine offenen Fragen geben kann, jedenfalls nicht im so einfachen Bereich,
ich habe freilich gerade selber eine…,

Dann muss dieses HowTo eben nachgebessert werden! :wink:

Oder tatsächlich hat sich was zwischen 6 7 geändert.

Dann schaue Dir doch erst mal deinen Eigenen Code soweit an, das du weißt woher du den zu überprüfenden String bekommst, vielleicht stellst du da ja fest, das er ganz anders aussieht, als du denkst, das dort noch andere Steuerzeichen
\r oder
oder auch oder sonst was drinnen steht am ende ein \eof,…
Wenn du dann weißt was dein Code macht und diesen als kurzen Programmablauf hier Posten kannst, können wir uns dann das Problem das du hast vielleicht genauer anschauen, aber solange wir das alles nicht wissen, kann hier leider nur ins blaue geraten werden.

Wie kann ich denn am einfachsten Whitespaces ausgeben lassen, s. d. sie visuell dargestellt werden, ohne ne Hexeditor öffnen, oder einen String automatisch maskieren, wie machen das Profis?

Ich persönlich verwende den Underscore _

Du kannst den String in einzelne Chars umwandeln (eine Liste/Array von Chars sozusagen) und dann von allen Ihren Wert ausgeben lassen.
Dafür eignet sich dann z.b. eine for-Schleife oder wenn es eine Liste oder Array ist sogar genauer eine for-each-Schleife.
In Java sieht so eine for-eache-Schleife wie folgt aus

String myString="test";
char[] charArray = new char[myString.length()];
for (char myChar:charArray ){
   System.out.println((int) myChar);
}

Unregistered: Dein Code funktioniert nicht. Du erzeugst ein char-Array wo überall nullen drinnen stehen, nicht der Inhalt von myString. Du hattest wohl eher String.toCharArray im Sinn. Und auch das ist suboptimal (erzeugt unnötigerweise ein neues Array), wenn man String.charAt verwendet. Der Cast nach int ist auch überflüssig im println.

@nillehammer
ja da hast du recht, ich habe das nur schnell getippt gehabt und ja ist irgendwie klar, das es ein leeres char Array ist.
OK das mit dem unnötigen cast wusste ich jetzt nicht, aber ja kann gut sein, das der überflüssig ist.
War auch mehr um @CyborgBeta das Prinzip mit den forEach-Schleifen zu erklären bzw damit er dann weiß, was für Zeichen er hat. (ging jetzt nicht um Performence,…)

die Kritik ist etwas übers Ziel hinausgeschossen,
char[] wenn richtig gefüllt statt charAt() ist oft handlicher, etwa for-each-Schleife statt mühsam einzelne Indexe,
bei eingesparten String-Methoden muss sich auch Performance evtl. nicht verstecken

und der int-Cast ist alles andere als überflüssig:
wenn man die Chars haben wollte kann man auch einfach so den String ausgeben, wozu untereinander einzeln?!
mit int wird es erst richtig spannend,
besonders wenn wie hier schon angesprochen verschiedene Arten von Leerzeichen, unsichtbare Steuer- wie Zeilenumbruch-Zeichen zu untersuchen sind…

für beste Übersicht sowohl char an sich als auch int nebeneinander ausgeben, aber kann bei Zeilenumbrüchen etwas wiederum unübersichtlich werden

Tatsächlich, mit dieser Methode konnte ich mir selber helfen:

        PrintWriter pw = new PrintWriter("text.txt");

        ArrayList<Character> alc = new ArrayList<Character>();
        for (char c = 32; c <= 126; c++) {
            alc.add(c);
        }
        alc.addAll(Arrays.asList('Ä', 'ä', 'Ö', 'ö', 'Ü', 'ü', 'ß', '€'));
        char[] ca = new char[alc.size()];
        for (int i = 0; i < alc.size(); i++) {
            ca** = alc.get(i);
        }
        Arrays.sort(ca);

        for (char c : ctext.toCharArray()) {
            if (Arrays.binarySearch(ca, c) < 0) {
                System.out.print("[" + (int) c + "]");
                pw.print("[" + (int) c + "]");
            } else {
                System.out.print(c);
                pw.print(c);
            }
            if (c == 10) {
                System.out.println("");
                pw.println();
            }
        }

        pw.flush();
        pw.close();
    }```

Resultat:
ctext steht für mystic text,
unter Win liefert sie mir 
 unter Linux 
 ,
obwohl die "Quelle" dieselbe ist,
das ist natürlich schlecht, weil die plattformunabhängigkeit und so
und schwer zu finden.

Thema gelöst, bis auf das mit "sonderzeichen" automatisch maskieren ..