Pattern.compile Syntax

Hintertür

Mitglied
Morgen Commy,

ich hab mal folgenden Code gebastelt, weil ich aus nem Text (input, cmd rückgabe) einen bestimmten Teil haben möchte, undzwar ob auf einem Interface DHCP aktiv ist oder nicht.

Kurz: Ich möchte einen Textausschnitt haben

Java:
public String textAuslesen(String input, String startOfInput, String endOfInput){
		Pattern p = Pattern.compile(".*?"+startOfInput+"\\s(.!?*?)\\s"+endOfInput);
		Matcher m = p.matcher(input);
		boolean matches = m.matches();
		int groupCount = m.groupCount();
		return m.group(1);
	}

Funktioniert im moment super! Doch sobald die Parameter folgendermaßen aussehen:

Java:
textAuslesen("Hallo wie geht es dir? Mir geht es sehr gut!", "dir", "gut");
schmeißt er ne Exception: No match found.

Wie bekomme ich jetzt in das Regex
Java:
Pattern.compile(".*?"....
jetzt nocht >!< und >?< hinein, bzw generell Sonderzeichen?

Danke im vorraus!
 
Zuletzt bearbeitet von einem Moderator:

Ariol

Top Contributor
Java:
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest
{

	public static String textAuslesen(String input, String startOfInput, String endOfInput)
	{
		Pattern p = Pattern.compile(".*" + startOfInput + "(.*)" + endOfInput + ".*");
		Matcher m = p.matcher(input);
		boolean matches = m.matches();
		int groupCount = m.groupCount();
		
		if(matches && groupCount > 0)
			return m.group(1);
		return "";
	}

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		System.out.println(textAuslesen("Hallo wie geht es dir? Mir geht es sehr gut!", "dir", "gut"));
	}

}
 

RySa

Bekanntes Mitglied
Also ich würd so etwas vorschlagen:
Java:
	public static void main(String args[]){
		String input = "Hallo wie geht es dir? Mir geht es sehr gut!";
                String startOfInput = "dir";
                String endOfInput = "gut";
	        Pattern p = Pattern.compile(".*?"+startOfInput+"(.*?)"+endOfInput);
	        Matcher m = p.matcher(input);

	        while(m.find()){
	        	System.out.println(m.group(1));
	        }

	}

Ein Punkt heißt ja schon beliebiges Zeichen, da musst du nicht die Sonderzeichen extra angeben, die sind schon da mit drin :)
 
Zuletzt bearbeitet:

Hintertür

Mitglied
@ Ariol: top! danke deine weise hat funktioniert!! aber wie mache ich das dann mit den whitespaces?

ich will folgenden textausschnitt haben:


sprich: ich will gucken ob DHCP aktiv ist (auf dem bestimmten interface)... wie realisiere ich sowas? da es ja mit tabs und halt den whitespaces ist (inner cmd)

@RySa: danke für die antwort! es lag an den \\s wie ich es herausgefunden hab^^
 
Zuletzt bearbeitet:

RySa

Bekanntes Mitglied
Ein Punkt nimmt auch Whitespaces an. d.h wenn du dir das (.*?) ausgeben lässt, und da drinne so etwas enthalten ist
Java:
String s = "                ja              "
, dann brauchst du es ja nur zu trimmen . Also
Java:
String s = "                   Ja                  ";
s = s.trim();

Dann hast du im s nur noch "Ja";
 

Hintertür

Mitglied
es will einfach nicht klappen... hmmm

sprich bei m.matches bricht er leider ab...

hmm ist das so schwer zu realisieren?^^

ich glaube man konnte sich die \r\n ect anzeigen lassen sprich wie in einer zeile...
wisst ihr wie das geht? dann wäre das auch einfacher^^

€dit: so sieht mein code bis jetzt aus:
erstmal der cmd command:

Java:
public String netshellReadDHCP() throws IOException, InterruptedException { 
		Runtime rt = Runtime.getRuntime();
		Process p = null;
		p = rt.exec ("netsh interface ipv4 show addresses");
		InputStream in = p.getInputStream();
		String ausgabe = StringTools.stringFromInputStream(in);
//		System.out.print(ausgabe);
		
		String endausgabe = pm.textAuslesen2(ausgabe, "Konfiguration der Schnittstelle \"Drahtlosnetzwerkverbindung\"", "IP-Adresse", true);
		
		System.out.println(endausgabe);
		//er soll wenns es klappt die endausgabe zurückgeben, und nicht "" ;D
		return "";
                
	}

ich habe bei der pattern methode noch was geändert:

Java:
/**
	 * Diese Methode gibt einen gesuchten Textabschnitt wieder zurück. 
	 * startOfInput und endOfInput sind Case-Sensitiv!
	 * 
     * @autor Christopher Kröncke
	 * @param input Input Text
	 * @param startOfInput Anfang des gesuchten Zwischenabschnittes
	 * @param endOfInput Ende des gesuchten Zwischenabschnittes
	 * @param trimFirstWhitespace Trimmt die whitespaces der vorherigen parameter
	 * @return Gibt den Zwischenabschnitt zurück
	 */
	public String textAuslesen(String input, String startOfInput, String endOfInput, boolean trimInputWhitespace){
		if (trimInputWhitespace){
			input = input.trim();
		}
		Pattern p = Pattern.compile(".*?" + startOfInput + "(.*?)" + endOfInput + ".*?");
		Matcher m = p.matcher(input);
		boolean matches = m.matches();
		int groupCount = m.groupCount();
		if(matches && groupCount > 0){
            return m.group(1);
		}
        return "No Match";
	}

p.s: könnt ihr auch benutzen wenn ihr mögt^^
 
Zuletzt bearbeitet:

RySa

Bekanntes Mitglied
Wie wärs wenn du einfach mal nochmal nach "(?i)(?s).*?DHCP aktiviert:.*?(Ja|Nein).*?" suchst. Also so etwas:
Java:
	public static void main(String[] args) {
	String input = "Konfiguration der Schnittstelle \"Drahtlosnetzwerkverbindung\" \n DHCP aktiviert:                  Ja                 \n IP Adresse:                      192.168.178.1        ";
        Pattern p = Pattern.compile("(?i)(?s).*?DHCP aktiviert:.*?(Ja|Nein).*?");
        Matcher m = p.matcher(input);
        while(m.find()){
        	System.out.println(m.group(1));
        }

	}

Ausserdem, (wenn ich mich nicht irre) musst du dem Matcher erstmal sagen "so, jetzt finde mal das nächste, das zutrifft" , also mit Matcher.find() - dann kannst du erst damit arbeiten. Mit .matches() überprüfst du nur ob der mal mindestens 1 Treffer hat, der Matcher ist aber noch nicht an die Stelle der Treffer gegangen, musst du ihm erst mit .find() sagen.

Gruß
 
Zuletzt bearbeitet:

HoaX

Top Contributor
Ohne komplizierte Regex gehts auch so:
Mittels String#split in die einzelnen Zeilen zerlegen und mit String#trim() die Leerzeichen außen herum entfernen.
Dann die Zeilen durchgehen und mit String#startWith die Zeile finden und mit String#endsWith auswerten.

Ist auch nicht viel mehr Code und auch für jemanden ohne Ahnung von Regex verständlich.
 

RySa

Bekanntes Mitglied
@ HoaX

Das mag ja sein, allerdings kann sich ein Wert, über mehrere Zeilen strecken und dann würde es nicht mehr so klappen. Und ich finde diese Regex ist gar nicht kompliziert, eher ganz anschaulich. Und falls jemand, wie du sagtest, keine Ahnung von Regex hat, dann wäre es jetzt der richtige Zeitpunkt sich mit denen auseinander zu setzen, weil die echt immer wieder zu gebrauchen sind.

Außerdem, nehme ich an, dass der TO eigentlich immer die Werte hinter name: haben möchte, also z.B IP Adresse: 192......., dann kann er einfach mal aus meinem letzten Beispiel ne Methode machen, der der Name übergeben wird, und dann einfach mal so gesucht wird: "(?i)(?s).*?"+name+":.*?(Ja|Nein).*?" , somit braucht er nur den kompletten String zu übergeben und den Namen. Das ist aber alles eine Sache der Implementierung.
 

Ariol

Top Contributor
Java:
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest
{

	public static boolean isDHCPEnabled(String input)
	{
		Pattern p = Pattern.compile("(?i)(?s).*DHCP aktiviert\\:\\s*(Ja|Nein).*");
		Matcher m = p.matcher(input);

		boolean matches = m.matches();
		if(!matches)
			return false;
		
		int groupCount = m.groupCount();
		String dhcpState = "Nein";
		if(groupCount > 0)
			dhcpState = m.group(1);
		return dhcpState.equals("Ja");
	}

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		System.out.println(isDHCPEnabled("Text davor\n    DHCP aktiviert:                       Nein\nText danach\n"));
		System.out.println(isDHCPEnabled("Text davor\n    DHCP aktiviert:                       Ja\nText danach\n"));
		System.out.println(isDHCPEnabled("Blub"));
	}

}

Works for me.

@RySa: Find brauchst du nicht, wenn du nur einmal prüfst:
http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#matches(java.lang.String hat gesagt.:
If a pattern is to be used multiple times, compiling it once and reusing it will be more efficient than invoking this method each time.
 

RySa

Bekanntes Mitglied
Hab ja gesagt "wenn ich mich nicht irre" :p anscheinend hab ich mich geirrt :) war aber so ne vermutung warum er bei ihm immer bei matches da "aufgegeben" hat :) ich benutze allerding immer das find(), habe mir so angewöhnt und konnte mich bisher noch nicht beschweren :) Also, die beiden Varianten funktionieren. Jetzt warten wa nur noch auf den TO ^^
 

Hintertür

Mitglied
so mädels,

habe beide varianten ausprobiert ;D das problem: ich weiß bei Ariol nicht was in den input soll... weil der input ja folgendes ist:

Konfiguration der Schnittstelle "Drahtlosnetzwerkverbindung"
DHCP aktiviert: Ja
Schnittstellenmetrik: 50

Konfiguration der Schnittstelle "LAN-Verbindung"
DHCP aktiviert: Ja
IP-Adresse: 192.168.160.112
Subnetzpräfix: 192.168.160.0/24 (Maske 255.255.255.0)

Standardgateway: 192.168.160.11
Gatewaymetrik: 0
Schnittstellenmetrik: 10

Konfiguration der Schnittstelle "Loopback Pseudo-Interface 1"
DHCP aktiviert: Nein
IP-Adresse: 127.0.0.1
Subnetzpräfix: 127.0.0.0/8 (Maske 255.0.0.0)
Schnittstellenmetrik: 50

soll ich das ganze in den input dann reinpacken? sorry das ich mich so blöd anstelle :/

€dit: mist er nimmt die whitespaces hier im forum nicht an °-° siehe bild oben ;)
 

RySa

Bekanntes Mitglied
Wenn du es ganz genau haben willst:
Java:
    public static void main(String[] args) {
    String input = "Konfiguration der Schnittstelle \"Drahtlosnetzwerkverbindung\" \n DHCP aktiviert:                  Ja                 \n IP Adresse:                      192.168.178.1        "; //usw, halt der ganze input von dir
    String start = "\"Drahtlosnetzwerkverbindung\"";
    String end = "IP Adresse";
        Pattern p = Pattern.compile("(?i)(?s)"+start+".*?DHCP aktiviert:.*?(Ja|Nein).*?"+end);
        Matcher m = p.matcher(input);
        while(m.find()){
            System.out.println(m.group(1));
        }
 
    }
 

Hintertür

Mitglied
ich danke Ariol und dir RySe auch besonders!! funktioniert jetzt :)
folgendes ist jetzt mein programmcode:

Java:
public String dhcp(String input, String interfaceName) throws IOException, InterruptedException{
            Pattern pattern = Pattern.compile("(?i)(?s)\""+interfaceName+"\".*?DHCP aktiviert:.*?(Ja|Nein).*?IP-Adresse");
            Matcher m = pattern.matcher(input);
            boolean matches =m.find();
            int groupCount = m.groupCount();
            if(matches && groupCount > 0){
                  if(m.group(1).equals("Ja")){
                        return "DHCP-On";
                  }else{
                        return "DHCP-Off";
                  }
            }
        return "No Match";
      }

und die methode funktioniert super auf DHCP :) danke nochmal leute!
 

eRaaaa

Top Contributor
Eieiei, die armen nicht-Windows-User und die, die nicht deutsch eingestellt haben... :D
Man könnte auch ganz ohne kompliziertem Regex auskommen und den Scanner nutzen ;)
Java:
		Scanner sc = new Scanner(input);
		while (sc.findWithinHorizon("DHCP aktiviert:", 0) != null) {
			System.out.println(sc.nextLine().trim());
		}
oder evtl. um doch noch ein wenig sprachunabhängiger zu sein (ka ob da bei englisch so etwas wie DHCP activated steht :bahnhof:= ) eben doch ein wenig Regex - so etwas wie:
Java:
sc.findWithinHorizon("DHCP .+?:", 0) != null) {
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
mihe7 equals und instanceOf pattern matching Allgemeine Java-Themen 9
L Pattern Eventhandler Allgemeine Java-Themen 5
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Z MVC Pattern - sinnvolle Integration Allgemeine Java-Themen 6
J Meinung zum verwendeten Design Pattern Allgemeine Java-Themen 4
Kirby.exe Filename nach bestimmtem Pattern durchsuchen Allgemeine Java-Themen 5
Meeresgott Best Practice "Spezifisches" Factory Pattern ? Allgemeine Java-Themen 1
H Strategy Pattern - changeColor() Methode - input rgd oder hex einlesen Allgemeine Java-Themen 1
M Vaadin MVP Pattern Allgemeine Java-Themen 1
N Java MVC Pattern richtig anwenden Allgemeine Java-Themen 24
M OOP Design Pattern - "extends Observable implements Observer" Allgemeine Java-Themen 0
K Factory Pattern: Mit Generics umgehen Allgemeine Java-Themen 6
perlenfischer1984 Welches Design Pattern ist geegneit. Allgemeine Java-Themen 7
perlenfischer1984 Hilfe bei Design (Pattern) Allgemeine Java-Themen 5
J Compilerfehler bis in java.util.regex.Pattern... Allgemeine Java-Themen 2
B MVC-Pattern größeres Beispiel Allgemeine Java-Themen 16
GreenTeaYT Verstehe nicht ganz das Observer Pattern in einer Arrayliste? Allgemeine Java-Themen 3
L Erste Schritte Java Date Format Pattern bestimmten Allgemeine Java-Themen 2
D Pattern mit Pattern vergleichen Allgemeine Java-Themen 3
D OOP Design Pattern für GUI - Datenbank Anwendung Allgemeine Java-Themen 1
S Hilfe bei geeignetem Pattern (Decorierer) Allgemeine Java-Themen 2
F Welches Design Pattern? Allgemeine Java-Themen 3
J Pattern aus String entfernen Allgemeine Java-Themen 2
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
D Variablen zur Laufzeit global speichern (Registry Pattern?) Allgemeine Java-Themen 6
Rudolf State Pattern als Enum? Allgemeine Java-Themen 10
M massenhaft verschiedene Date-Pattern Allgemeine Java-Themen 3
Guybrush Threepwood Pattern gesucht: Punkt ohne Leerzeichen dahinter Allgemeine Java-Themen 3
turmaline OOP Decorater Pattern für Varifikationsverhalten Allgemeine Java-Themen 13
T HTML Tag Position mittels Pattern ermitteln Allgemeine Java-Themen 7
X Datentypen Prozentualer Abgleich zwischen 2 Strings (Pattern?) Allgemeine Java-Themen 3
B RegEx: (Um-)formulieren eines Pattern zur Identifizierung komplexer URLs Allgemeine Java-Themen 7
D [Drag&Drop] Design-Pattern-Frage Allgemeine Java-Themen 4
T Pattern für Benutzer-Gruppen, RMI Allgemeine Java-Themen 5
E Super erzwingen, konzept/pattern gesucht. Allgemeine Java-Themen 8
H Problem mit der Klasse Pattern - Regulärer Ausdruck Allgemeine Java-Themen 2
Eldorado Meinung zu einem abgewandelten MVC-Pattern Allgemeine Java-Themen 2
R Matcher - Pattern mit belibigem Anfang Allgemeine Java-Themen 2
H Bestimmten String mit Pattern und Matcher herauslesen => kein erfolg Allgemeine Java-Themen 9
I Pattern zum Erweitern existierender Objekte Allgemeine Java-Themen 4
I Template Method pattern mit "geschützten Methoden" Allgemeine Java-Themen 5
T Pattern: Passive View Allgemeine Java-Themen 2
K Verständnisprobleme bei Observer-Pattern mit größerem Datenmodell Allgemeine Java-Themen 32
T Pattern: Greedy, Reluctant, Possessive Allgemeine Java-Themen 4
S Hilfe bei Pattern Allgemeine Java-Themen 5
N Registry Pattern Allgemeine Java-Themen 7
Tandibur Denkfehler bei Pattern.matches? Allgemeine Java-Themen 3
Tandibur pattern dynamisch vorkompilieren Allgemeine Java-Themen 9
A Observer Pattern: feuern bei neuer Referenz-Zuweisung? Allgemeine Java-Themen 8
N Pattern Allgemeine Java-Themen 11
Iron Monkey Pattern - Matcher - Problem Allgemeine Java-Themen 3
ruutaiokwu welches design pattern? frage an die oo-experten unter euch... Allgemeine Java-Themen 3
G Accordion Design Pattern Frage Allgemeine Java-Themen 2
hdi Hilfe beim Design (Stichwort OO, Pattern, ...) Allgemeine Java-Themen 11
U Verständnisschwierigkeiten Observer Pattern Allgemeine Java-Themen 18
H2SO3- String(pattern) von SimpleDateFormat auslesen Allgemeine Java-Themen 7
M Problem mit Pattern Allgemeine Java-Themen 3
N Welches design pattern? Allgemeine Java-Themen 8
B Pattern gesucht, Programm Optionen, Casten vermeiden Allgemeine Java-Themen 3
D Welches Pattern kann ich nutzen? Allgemeine Java-Themen 9
J Suche regex-Pattern fuer Liste von Zahlen zwischen 0-100 Allgemeine Java-Themen 6
G Sequenzdiagramm Dao Pattern Allgemeine Java-Themen 3
D Observer/Observable Pattern vs. Listener-Konzept Allgemeine Java-Themen 4
S regex-Pattern Ausdruck negieren Allgemeine Java-Themen 2
J Pattern eines Textes Allgemeine Java-Themen 4
M Java Garbage Collector Frage (Singleton Pattern) Allgemeine Java-Themen 13
Y Pattern Problem Allgemeine Java-Themen 2
G UML-Diagramme mit DAO Pattern Allgemeine Java-Themen 7
S Pattern regex Allgemeine Java-Themen 2
G Composite, Design Pattern, printTree Allgemeine Java-Themen 42
J Regex Pattern Problem Allgemeine Java-Themen 12
P MVC Pattern Allgemeine Java-Themen 31
C Pattern für Kommunikation gesucht Allgemeine Java-Themen 3
G Frage zu MVC Pattern Allgemeine Java-Themen 6
J Pattern und Regex Allgemeine Java-Themen 2
L Wie Pattern anwenden um Cipher zu nutzen Allgemeine Java-Themen 2
S Singleton Pattern mit Generics Allgemeine Java-Themen 4
M MVC Design Pattern - Verständniss Fragen Allgemeine Java-Themen 3
F Typüberprüfung in Superklasse - geeignetes Pattern? Allgemeine Java-Themen 11
M Java Pattern hilfe Allgemeine Java-Themen 6
N Observer Pattern Allgemeine Java-Themen 2
G Problem mit MVC-Pattern (Controller als anonyme Unterklasse) Allgemeine Java-Themen 2
F Design Pattern zur Realisierung von Mehrfachvererbung? Allgemeine Java-Themen 8
M Pattern aus Properties Allgemeine Java-Themen 3
I Composite Pattern für Ausgabe von Ausdruck Allgemeine Java-Themen 3
G mit Pattern strings filtern ein kleines problemchen ;) Allgemeine Java-Themen 2
M nach einem Pattern splitten Allgemeine Java-Themen 2
F Composite Pattern in Java? Allgemeine Java-Themen 1
G problem mit dem observer pattern Allgemeine Java-Themen 3
C Matcher/Pattern ersetzten für JDK 1.3 Allgemeine Java-Themen 2
M Pattern: Summary of regex constructs: Backslash Allgemeine Java-Themen 2
G Scanner und Abbruchbedingung/Pattern Allgemeine Java-Themen 2
F suche im Classpath mit Pattern *.gif Allgemeine Java-Themen 16
G Frage zum Observer Pattern Allgemeine Java-Themen 4
D Design Pattern: Singleton Allgemeine Java-Themen 4
M Pattern, Matcher, Split Allgemeine Java-Themen 2
J .java-Dateitext Compile zur Laufzeit ohne File Allgemeine Java-Themen 15
T Methodenparameter zur Compile-Zeit überprüfen Allgemeine Java-Themen 8
N C source to Java Source -> compile java layer? Allgemeine Java-Themen 9
Tommy135 Syntax Highlighting Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben