Bestimmten String mit Pattern und Matcher herauslesen => kein erfolg

Hintertür

Mitglied
Hallo Community,

Suche und google benutzt, keine passende lösung bevor was is^^

bin neu hier und hoffe es gefällt mir 🙂
Kurz zu mir: Ich bin noch nicht lange in der Java-Programmierung drinne ( erst seit ca 1 1/2 Jahren) und habe neulich an einem neuen Programm gearbeitet. Dort wollte ich, um eine bestimmte Textstelle herauszulesen, die Klassen Pattern und Matcher hinzuziehen. In einem kleinen Beispielprogramm funkioniert es:
Java:
 import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class TestClass {

    
    public void test() {
        String st = "das ist Text und HIER ist mehr Text";
        
        Pattern p = Pattern.compile(".*?HIER\\s(.*?)Text");
        Matcher m = p.matcher(st);
        boolean matches = m.matches();
        int groupCount = m.groupCount();
        String interessanterString = m.group(1);
    }

Im String "interessanterString" steht "ist mehr" drin. Funktioniert super. Doch es ist nur ein kurzer Text im vergleich zu:


#============================
# Schnittstellenkonfiguration
#============================
pushd interface
reset all
popd
# Ende der Schnittstellenkonfiguration

#============================
# Schnittstellenkonfiguration
#============================
pushd interface ipv6
uninstall
popd
# Ende der Schnittstellenkonfiguration
# ----------------------------------
# ISATAP-Konfiguration
# ----------------------------------
pushd interface ipv6 isatap
popd
# Ende der ISATAP-Konfiguration
# ----------------------------------
# 6-zu-4-Konfiguration
# ----------------------------------
pushd interface ipv6 6to4
reset
popd
# Ende der 6-zu-4-Konfiguration
#========================
# Portproxykonfiguration
#========================
pushd interface portproxy
reset
popd
# Ende der Portproxykonfiguration

# ----------------------------------
# Schnittstellen-IP-Konfiguration
# ----------------------------------
pushd interface ip


# Schnittstellen-IP-Konfiguration für ""LAN-Verbindung""

set address name="LAN-Verbindung" source=dhcp
set dns name="LAN-Verbindung" source=dhcp register=PRIMARY
set wins name="LAN-Verbindung" source=dhcp


popd
# Ende der Schnittstellen-IP-Konfiguration

Wie ihr seht: deutlich länger^^
Ich möchte gerne "dhcp" von "set address name="LAN-Verbindung" source=dhcp " herauslesen, und er will mir den String einfach nicht geben. Mein code dazu:
Java:
        Runtime rt = Runtime.getRuntime();
        Process p = null;
        p = rt.exec ("netsh interface dump");
//        p.waitFor();
        InputStream in = p.getInputStream();
        String ausgabe = StringTools.stringFromInputStream(in);// Liest die ausgabe ein und schreibt sie zu ausgabe hinzu
        Pattern pattern = Pattern.compile(".*?set address name=\"LAN-Verbindung\" source=(.*?) \\r\\nset dns name=");
        Matcher m = pattern.matcher(ausgabe);
        boolean matcher =m.matches();
        int groupCount = m.groupCount();
        String interessanterText = m.group(1);
        if (interessanterText.equalsIgnoreCase("dhcp")) {
            System.out.println("Funktioniert");
        }

Der Text hier steht im String ausgabe drinne (der dos befehl mit zeilenumbrüchen): "\r\nset address name="LAN-Verbindung" source=dhcp \r\nset dns name="

Mache ich etwas falsch? habe ich was blödes Programmiert?^^
Komme einfach nicht weiter...

MfG,
Hintertür
 
Vllt funktioniert:
[JAVA=7]
Pattern pattern = Pattern.compile("set address name=\"LAN-Verbindung\" source=(\\w*)")
[/code]
 
hab ich mir schon gedacht 🙂 hab ich auch probiert leider ohne erfolg..

ich dachte schon daran das es an den mehreren zeilen liegt, sprich man könnte auch MULTILINE
(Java Platform SE 6 Pattern) testen, jedoch hab ich keine ahnung wie ich es aktiviere... 🙁

danke schonmal für die schnelle antwort

Edit: bei dir fehlt noch das .*? vor set oder meinste das auch mal weg? oO
 
also das gepostete beispielprogramm funzt einwandfrei, habe mir gedacht, ist ja nur nen anderer string, und andere werte (marker) zum auslesen.

falsch gedacht leider, funzt nicht.

und habs grad nochmal mit \\w* versucht (deinem zitat nach) und der boolean matcher sagt immernoch false :/
 
Zuletzt bearbeitet:
ok, das problem hat sich gelöst....

anstatt den
m.matcher();

musste ich nen
m.find(); machen.... danke trotzdem für die hilfe @ XHelp 🙂

MfG
Hintertür
 
Hallo,

Java:
Pattern pattern = Pattern.compile(".*?set address name=\"LAN-Verbindung\" source=(.*?) \\r\\nset dns name=");
Ich würde hier vorschlagen zuerst einmal das space zu löschen bzw. durch einen flexiblen RegEx zu ersetzen...weil hinter "source=(.*?)" noch ein Space steht...

Java:
Pattern pattern = Pattern.compile(".*?set address name=\"LAN-Verbindung\" source=(.*?)\\s*");
Dann würde das RegEx noch ein wenig flexibler im Bezug auf White-Spaces machen...

Java:
Pattern pattern = Pattern.compile(".*?set\\s+address\\s+name\\s*=\\s*\"LAN-Verbindung\"\\s+source=(.*?)\\s*");

Eventuell würde ich mir auch überlegen das Ganze in drei RegEx zu machen....

Gruß
Karl Heinz Marbaise
 
Hi kama,

danke für deine überlegungen und die zeit!
das problem lag unteranderem beim Pattern.compile, jedoch auch beim matcher. der richtige programmcode ist folgender (bzw. eine möglichkeit):
Java:
Pattern pattern = Pattern.compile("set address name=\"LAN-Verbindung\" source=(.*?)set dns name=",Pattern.DOTALL );
        Matcher m = pattern.matcher(ausgabe);
        boolean matcher =m.find();
Edit: damit meine ich das ich das problem nach langer suche in den docs doch noch gefunden habe :/
 

Zurück
Oben