[Regex] Zeichen ausschließen

Status
Nicht offen für weitere Antworten.

Tobias

Top Contributor
Hi,

ich habe folgendes Pattern:

Code:
(\[[(.+?)(=(.+?))?\s?+/\])

Das matcht so Sachen wie [br /] oder auch [br=wide/], gebraucht wird es für einen BBCode-Interpreter. Nun gibt es aber folgendes Problem:

Der Text

[h1]Überschrift[/h1][br /]Satz 1[br /]Satz 2[br /][imp]Wichtiger Satz 3[/imp]

wird von obigem Regex wie folgt aufgeteilt:

  • [h1]Überschrift[/h1][br /]
    [br /]
    [br /]

der erste Treffer ist also viel zu lang, weil die öffnende Klammer des [h1] genommen wird und nicht die öffnende Klammer von [br/]. Da ich bereits den Gebrauch von reluctant quantifiers praktiziere (was mir hier nichts nutzt, weil von vorne nach hinten gematcht wird), fällt mir als Lösung nur ein, dem Pattern zu verbieten, "[" oder "]" zu matchen, ausgenommen letzteres wird von einem "/" eingeleitet. Aber wie bringe ich dem Pattern bei, dass diese Zeichen nirgends im Match auftauchen dürfen außer als erstes und letztes Zeichen?

mpG
Tobias
 
S

SlaterB

Gast
'ein kompilierbares, _kurzes_ Beispiel, das das von dir beschriebene Verhalten zeigt.'
wäre hier auch nicht schlecht..
( http://www.java-forum.org/de/viewtopic.php?t=72400 )

dein Pattern ist gar nicht kompilierbar, es enthält zwei öffnende eckige Klammern, aber nur eine schließende

denkbar ist:

Code:
public class Test {

	public static void main(String[] args) throws Exception {

		String pattern = "(\\[([^\\[\\]]*)/\\])";
		Pattern p = Pattern.compile(pattern);
		Matcher m = p.matcher("d[h1]Überschrift[/h1][br /]");
		while (m.find()) {
			System.out.println(m.group(1));
			System.out.println(m.group(2));
		}
	}
}
 

Tobias

Top Contributor
Kleines kompilierbares Beispiel (war spät gestern, sorry):

Code:
public class RegexTester {

	public static final String TEXT = "[h1]Überschrift[/h1][br /]Satz 1[br /]Satz 2[br /][imp]Wichtiger Satz 3[/imp]";

	public static final String PATTERN = "(\\[(.+?)(=(.+?))?\\s?+/\\])";

	private Matcher matcher;

	public RegexTester() {
		matcher = Pattern.compile(PATTERN).matcher(TEXT);
	}

	public boolean matches() {
		return matcher.find();
	}

	/**
	 * @return a list of all matches
	 */
	public String[] getMatches() {
		List<String> matches = new ArrayList<String>();
		int offset = 0;

		while (matcher.find(offset)) {
			matches.add(TEXT.substring(matcher.start(), matcher.end()));
			offset = matcher.end();
		}

		return matches.toArray(new String[matches.size()]);
	}

	public static void main(String[] args) {
		RegexTester regTest = new RegexTester();

		System.out.println("Text:\t" + TEXT);
		System.out.println("Pattern:\t" + PATTERN);
		System.out.println("Matches:\t" + regTest.matches());
		System.out.println("All Matches:");
		for (String match : regTest.getMatches()) {
			System.out.println(match);
		}
	}

}

EDIT:
Wichtig ist, dass die Gruppen innerhalb der eckigen Klammern erhalten bleiben, da der darauf aufbauende Code später anhand dieser Gruppen den Tagnamen und den Parameter sucht.

mpG
Tobias
 
S

SlaterB

Gast
ich behaupte, die Frage schon beantwortet zu haben,

wenn dem nicht so ist, dann bitte Rückmeldung :bae:
 

Tobias

Top Contributor
siehe Edit ;)

Wie fasse ich die Zeichensequenz (inklusive der Match-Gruppen zwischen den eckigen Klammern so zusammen, das ich die Zeichengruppe [^\[\]] davon subtrahieren kann?

mpG
Tobias
 
S

SlaterB

Gast
mit meinem Pattern drin ist die Ausgabe

Text: [h1]Überschrift[/h1][br /]Satz 1[br /]Satz 2[br /][imp]Wichtiger Satz 3[/imp]
Pattern: (\[([^\[\]]*)/\])
Matches: true
All Matches:
[br /]
[br /]
[br /]


also nur "Überschrift[/h1]" weg, wie gewünscht,

was ansonsten die Aufgabe ist und was
[(.+?)(=(.+?))?\\s?
genau bedeutet habe ich noch nicht durchdrungen,

was genau läuft denn nun noch nicht?
 
S

SlaterB

Gast
vielleicht sowas:
Code:
public class RegexTester
{
    public static final String TEXT = "[h1]Überschrift[/h1][br x = y /]Satz 1[br /]Satz 2[br /][imp]Wichtiger Satz 3[/imp]";
    public static final String PATTERN = "(\\[([^\\[\\]=]+)?(=([^\\[\\]]+))?\\s?+/\\])";

    private Matcher matcher;

    public RegexTester()
    {
        matcher = Pattern.compile(PATTERN).matcher(TEXT);
    }

    public void getMatches()
    {
        while (matcher.find())
        {
            System.out.println("found: " + matcher.group(1) + ", " + matcher.group(2) + ", " + matcher.group(3));
        }
    }

    public static void main(String[] args)
    {
        RegexTester regTest = new RegexTester();

        System.out.println("Text:\t" + TEXT);
        System.out.println("Pattern:\t" + PATTERN);
        System.out.println("All Matches:");
        regTest.getMatches();
    }
}
 

Tobias

Top Contributor
Ein Tag besteht aus zwei Teilen, der zweite ist optional:

1. Der Tag-Name, in unseren Fall "br".
2. Ein Parameter, welcher vom Tag-Namen durch ein "=" getrennt wird. Das ermöglicht zum Beispiel [br=wide /], um einen breiten Zeilenumbruch einzufügen (nur ein Beispiel).

Code:
(\[(.+?)(=(.+?))?\s?/\])

matcht Ausdrücke, die von einer führenden eckigen Klammer eingeleitet werden und durch Slash + schließende eckige Klammer beendet werden. Innerhalb der eckigen Klammern befindet sich dabei ein Ausdruck folgender Struktur:
Zuerst eine beliebige Zeichenkette aus mindestens einem Zeichen (matcht sowenig Zeichen wie möglich) (das ist der Tag-Name), gefolgt von einer optionalen Zeichenkette bestehend aus einem "=" mindestens einem Zeichen (reluctant) (das ist der optionale Parameter-String). Zwischen dem Parameter und der schließenden Slash+eckiger Klammer-Kombination kann beliebig viel Whitespace stehen.

Wichtig für die spätere Verarbeitung sind die Match-Gruppen des Ausdrucks (die runden Klammern):

1. Gruppe: Der gesamte Tag
2. Gruppe: Der Tag-Name
3. Gruppe: Der Parameter inklusive "="
4. Gruppe: Der Parameter

nummeriert werden die Gruppen nach der Reihenfolge ihrer öffnenden Klammern.

Diese innere Struktur des Regex muß bewahrt werden, gleichzeitig müssen aber eckige Klammern außer der öffnenden und der schließenden an den Enden verboten werden. Bei deinem Pattern ist weder sichergestellt, das der Tag die richtige Syntax befolgt (es würden auch Klammersätze zweiter Ordnung gematcht [also sowas hier] und müssten anschließend manuell ausgesondert werden), noch stehen die oben beschriebenen Match-Gruppen für die Weiterverarbeitung zur Verfügung.

mpG
Tobias
 

Tobias

Top Contributor
Danke! Dein zweiter Vorschlag tut - glaube ich, Tests laufen gerade - genau was ich wollte. Ich hab nur das erste Fragezeichen in die Klammer geschoben, weil der Tag-Name nicht optional ist, sondern nur möglichst kurz. Vielen Dank für deine Hilfe!

mpG
Tobias
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Zeichen | in regex Allgemeine Java-Themen 8
S [Regex] Nur diese Zeichen beachten Allgemeine Java-Themen 1
P RegEx und $-Zeichen als Literal Allgemeine Java-Themen 5
J RegEx: "wenn zeichen folgen ersetze x mit y, sonst mit Allgemeine Java-Themen 2
H Frage regex greater than less than Allgemeine Java-Themen 7
N Regex schlägt nicht an Allgemeine Java-Themen 10
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
T regex case insensitive trimmed Allgemeine Java-Themen 6
X Regex mit mehreren Bedingungen machen Allgemeine Java-Themen 5
N Hilfe bei RegEx benötigt Allgemeine Java-Themen 3
C Java17 und Regex Allgemeine Java-Themen 13
OnDemand RegEx /compilebekomme nicht die erwarteten Werte Allgemeine Java-Themen 9
N Gierigen Regex in nicht-gierigen umwandeln Allgemeine Java-Themen 4
N E-Mail Validator (ohne Regex!) Allgemeine Java-Themen 7
OnDemand Regex von bis Allgemeine Java-Themen 6
W Versionsnummer auslesen - Regex ist zickig Allgemeine Java-Themen 2
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
G Regex Allgemeine Java-Themen 2
L regex ganzer string? Allgemeine Java-Themen 2
MiMa Geldbetrag mit regex ermitteln. Allgemeine Java-Themen 14
W RegEx Stringliteral finden - Jflex Allgemeine Java-Themen 5
D Regex Probleme Allgemeine Java-Themen 2
Kirby.exe Regex charakter ignorieren Allgemeine Java-Themen 12
S Java SAT (Haltbarkeitsproblem) mit Regex Allgemeine Java-Themen 6
M Bitte Hilfe mit REGEX (Negieren) Allgemeine Java-Themen 4
J Compilerfehler bis in java.util.regex.Pattern... Allgemeine Java-Themen 2
C PDFBox: Nach RegEx ganze Zeile Allgemeine Java-Themen 4
S Regex mit UND-Verknüpfung Allgemeine Java-Themen 1
P RegEx für Zeiten Allgemeine Java-Themen 7
D Regex: Komplettes Wort bekommen Allgemeine Java-Themen 3
Neumi5694 Operatoren regEx für das Erstellen eines Strings verwenden Allgemeine Java-Themen 3
P RegEx Allgemeine Java-Themen 3
W String Parsen und auf eigenes Muster anwenden (kein Regex) Allgemeine Java-Themen 11
Y regex | n-faches Vorkommen oder gar keins Allgemeine Java-Themen 6
turmaline Regex gegen Regex prüfen Allgemeine Java-Themen 4
HarleyDavidson Regex - Optimierung Allgemeine Java-Themen 4
M Regex für Zahleneingabe in JavaFX Textfield Allgemeine Java-Themen 18
T Best Practice Wortregeln RegEx Allgemeine Java-Themen 11
A ALTER TABLE mit Hilfe von RegEx zerlegen, splitten Allgemeine Java-Themen 5
H Interpreter-Fehler Regex kompiliert nicht Allgemeine Java-Themen 5
M RegEx alle Matches ausgeben Allgemeine Java-Themen 5
Iron Monkey Mit Regex nach Beträge suchen Allgemeine Java-Themen 4
T REGEX Erklaerung Allgemeine Java-Themen 14
T Nur innerhalb des regex-Match ersetzen Allgemeine Java-Themen 9
H Pic Download / Regex Problem Allgemeine Java-Themen 7
F Frage zu Regex möglich Allgemeine Java-Themen 4
M Regex... mal wieder Allgemeine Java-Themen 3
H RegEx - Ersetze alles bis Leerzeichen Allgemeine Java-Themen 5
S regex verbrät CPU Allgemeine Java-Themen 6
V Regex Bereichs Filter Allgemeine Java-Themen 4
127.0.0.1 RegEx _ und 0-9 Allgemeine Java-Themen 45
S Entfernen von allen Nicht-Buchstaben chars aus einem String ohne Regex..? Allgemeine Java-Themen 10
P Java String Regex Allgemeine Java-Themen 2
AyKay Regex XPath Allgemeine Java-Themen 4
C Regex (Case insensitive und Umlaute) Allgemeine Java-Themen 4
D Regex Raute erkennen Allgemeine Java-Themen 2
nrg Zweistelligen Zahlenbereich mit RegEx Allgemeine Java-Themen 8
GilbertGrape Regex-Problem Allgemeine Java-Themen 2
W Denkblockade RegEx Allgemeine Java-Themen 2
S eigene regEx schreiben Allgemeine Java-Themen 4
C Regex expandieren Allgemeine Java-Themen 6
C Regex Überschniedung von Ausdrücken Allgemeine Java-Themen 16
reibi RegEX - Teilstring Allgemeine Java-Themen 6
R Java-RegEx terminiert nicht Allgemeine Java-Themen 3
M Regex: Ich stehe auf dem Schlauch Allgemeine Java-Themen 2
V Kleines Regex-Problem Allgemeine Java-Themen 3
B Regex "Problem" Allgemeine Java-Themen 4
B RegEx: (Um-)formulieren eines Pattern zur Identifizierung komplexer URLs Allgemeine Java-Themen 7
P RegEx mit HTML Parser für Java möglich? Allgemeine Java-Themen 10
J Regex: Fertige URLS aus Javascript Allgemeine Java-Themen 3
N Java regex Allgemeine Java-Themen 5
K Regex JSON Allgemeine Java-Themen 3
J RegEx Ausdruck Allgemeine Java-Themen 2
J Regex: URLS aus CSS Allgemeine Java-Themen 2
G RegEx- Ausdruck Allgemeine Java-Themen 4
G RegEx kein Unterstrich Allgemeine Java-Themen 2
A Text via RegEx durchsuchen und teile ersetzten Allgemeine Java-Themen 5
C Regex: Zahl ohne führende Null Allgemeine Java-Themen 13
W RegEx Zeile parsen Medium Allgemeine Java-Themen 8
X Java String Regex - Sonderzeichen Filtern Allgemeine Java-Themen 5
S Dateiname mit Regex parsen Allgemeine Java-Themen 3
Loyd Noch ne Regex-Frage: Verschachtelte Ausdrücke Allgemeine Java-Themen 4
R Java Regex Frage Allgemeine Java-Themen 17
Daniel_L RegEx-Frage: Ersetzen in UBB ausschließen Allgemeine Java-Themen 2
M Große Datei mit Regex durchsuchen Allgemeine Java-Themen 4
S regex für einen Link Allgemeine Java-Themen 3
E Regex alles nach ? löschen Allgemeine Java-Themen 4
M RegEx-Frage Allgemeine Java-Themen 2
R Regex Tokenizer Allgemeine Java-Themen 11
E Regex HTML Tag und Inhalt löschen Allgemeine Java-Themen 4
H RegEX und eMail Allgemeine Java-Themen 4
L-ectron-X Regex zum Entfernen von mehrzeiligen Kommentaren Allgemeine Java-Themen 2
martin82 Regex - JTable - Filter Allgemeine Java-Themen 10
nrg Kleine Hilfe mit RegEx Allgemeine Java-Themen 2
B Regex-Fehler nach lib-Update Allgemeine Java-Themen 2
K Contrains oder Regex Allgemeine Java-Themen 3
J replaceAll , "[", "]" & regex Allgemeine Java-Themen 12
P RegEx - Worte ausschließen Allgemeine Java-Themen 8
S Regex - was isst denn {javaLetter} und {javaDigit}? Allgemeine Java-Themen 2
D Wie werden Regex-Gruppen kompiliert? Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben