reguläre Ausdrücke finden nicht was sie finden sollen

Curry

Aktives Mitglied
Moin Moin!

Ich habe zwei Probleme mit reguläre Ausdrücken.

1)
Ich möchte die Anzeige meiner Tabelle anhand eines Namens in einem Feld filtern. Der Inhalt des Feldes schaut z.B. so aus "Müller P, Stolz KW, Nolte K, Schmidt HG, Mayer F".

Ich möchte das Einträge auch gefunden werden wenn der Name noch nicht vollständig geschrieben wurde (aber beim Anfang des Namens muss begonnen werden) und es soll möglich sein nach mehreren Namen gleichzeitig (am besten mit einer und / oder Möglichkeit, z.B. durch Eingabe von "|" oder "+") zu Suchen.

Der zu suchende Namen wird in ein JTextField eingegeben. Das obere Beispiel soll z.B. gefunden werden bei der Eingabe von "S", "Sto", "Stolz KW" oder "KW". Aktuell verwende ich den folgenden Code:

Java:
RowFilter<MyTableModel, Integer> authorFilter = new RowFilter<MyTableModel, Integer>() {
	public boolean include(Entry<? extends MyTableModel, ? extends Integer> entry) {
		MyTableModel tableModel = entry.getModel();
		Paper paper = tableModel.getPaper(entry.getIdentifier());

		String regex = "(?i)[\\w]*(" + model.getFilter(FILTER_AUTHOR) + ")[\\w]*";
		
		System.out.println(paper.getAuthorList() + " => " + regex);
		
		if (paper.getAuthorList().matches(regex)) {
				return true;
		}
		return false;
	}
};

2)
Bei meinem zweiten Problem möchte ich gerne Teile eines Textes, der in einem JEditorPane angezeigt wird, rot hervorheben, wenn diese in einem JTextField eingetragen wurden. Doch auch dies funktioniert leider nicht so wie ich es versuche. Derzeit schaut der Code so aus:

Java:
String str = tableModel.getPaper(rowIndex).getText();
String filter = model.getFilter(FILTER_ABSTRACT);
if(filter.length() > 0) {
	System.out.println("filter -> " + filter);
	str.replaceAll("(" + filter + ")", "<span style=\"color: #FF0000;\">" + filter + "</span>");
}
String text = "<p style=\"margin: 0px 0px 5px 0px; text-align: justify;\">" + str + "</p>";

Würde mich sehr über Hilfe und Tipps freuen!!
 

JPT

Mitglied
Auf den ersten Blick seh ich jetzt nichts.
Falls du mit Eclipse arbeitest, hast du dir das QuickRex-Plugin installiert?
Damit kannst du RegEx ausprobieren, und siehst sofort ob es funktioniert.
 

JPT

Mitglied
Ah.

1. Problem:
Ich denke das Problem liegt in:
Java:
getAuthorList().matches()

2. Problem:
Schreibe
Java:
str = str.replaceAll("(" + filter + ")", "<span style=\"color: #FF0000;\">" + filter + "</span>");
 

Curry

Aktives Mitglied
zum 2. Problem:
Danke, JPT, das war natürlich das Problem ... wer die API Specification lesen kann ist klar im Vorteil. ;-)

bezüglich des 1. Problems:
Ich verwende "The Regex Coach" zum Testen und dort markiert er mir die Teile Namensliste richtig. Allerdings erfüllt der RegEx auch dort noch nicht das Kriterium, dass das keine Zeichenkombinationen inmitten eines Namens gefunden werden sollen.

Ich probiere aber mal, ob ich das nicht ohne einen RegEx hinbekomme (split, for-Schleife, toLowerCase, startsWith). Allerdings stelle ich mir die Frage nach der Performance. Wie schaut's aus wenn ich da mehrere 100 Zeilen in der Tabelle habe?
 

Antoras

Top Contributor
Wenn du jeden Datensatz in einem eigenen Objekt verwaltest, dass hast du gleich viel weniger Probleme. Splitte die Namen mit
Code:
split
und such dann den String mit
Code:
contains
. Falls du gleich noch die Position des gefundenen Substrings brauchst reicht auch
Code:
indexOf
.

Keine Ahnung was du hier mit Regex willst. Es gilt doch: Wenn du ein Problem hast und es mit Regex lösen willst, dann hast du zwei Probleme.

Performance sollte bei ein paar hundert Datensätzen noch keine Probleme machen.
 

Mizar

Aktives Mitglied
bezüglich des 1. Problems:
Ich verwende "The Regex Coach" zum Testen und dort markiert er mir die Teile Namensliste richtig. Allerdings erfüllt der RegEx auch dort noch nicht das Kriterium, dass das keine Zeichenkombinationen inmitten eines Namens gefunden werden sollen.
Davon ausgehend, dass alle Namen immer mit Kommas voneinander getrennt sind, sollte der folgende reguläre Ausdruck das verlangte Kriterium erfüllen:
Code:
(?i)([^,]*\b<Hier Suchstring einfügen>[^,]*)
Hier mal ein kurzes, kompilierbares (evtl. noch unausgereiftes) Beispiel mit eben diesem regulären Ausdruck im Einsatz:
Java:
public class Namesearcher
{
	public static void main(String[] args)
	{
		JFrame frame = new JFrame("Namesearcher");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		final JTextField searchField = new JTextField();
		final JTextField dataField = new JTextField();
		final JTextField resultField = new JTextField();
		searchField.setDocument(new CertainCharactersDocument("[^\\p{Alpha}ÄÖÜäöüß -]"));
		dataField.setDocument(new CertainCharactersDocument("[^\\p{Alpha}ÄÖÜäöüß, -]"));
		DocumentListener docListener = new DocumentListener()
		{
			@Override
			public void removeUpdate(DocumentEvent e)
			{
				search();
			}
			
			@Override
			public void insertUpdate(DocumentEvent e)
			{
				search();
			}
			
			@Override
			public void changedUpdate(DocumentEvent e)
			{
				// empty
			}
			
			private void search()
			{
				String searchString = searchField.getText();
				if(searchString.isEmpty()) {
					resultField.setText("");
				} else {
					Pattern pattern = Pattern.compile("(?i)([^,]*\\b" + searchString + "[^,]*)");
					Matcher matcher = pattern.matcher(dataField.getText());
					StringBuilder str = new StringBuilder();
					while(matcher.find()) {
						str.append(matcher.group(1));
					}
					resultField.setText(str.toString());
				}
			}
		};
		searchField.getDocument().addDocumentListener(docListener);
		dataField.getDocument().addDocumentListener(docListener);
		dataField.setText("Müller P, Stolz KW, Nolte K, Schmidt HG, Mayer F");
		resultField.setEditable(false);
		
		Container container = frame.getContentPane();
		container.setLayout(new GridLayout(3, 2));
		container.add(new JLabel("Search for:"));
		container.add(searchField);
		container.add(new JLabel("Data:"));
		container.add(dataField);
		container.add(new JLabel("Result:"));
		container.add(resultField);
		
		frame.pack();
		frame.setVisible(true);
	}
}

class CertainCharactersDocument extends PlainDocument
{
	private static final long serialVersionUID = 8295705287949439607L;
	private String illegalCharactersRegex;
	
	public CertainCharactersDocument(String illegalCharactersRegex)
	{
		this.illegalCharactersRegex = illegalCharactersRegex;
	}
	
	@Override
	public void insertString(int offs, String str, AttributeSet a) throws BadLocationException
	{
		if(str.matches(illegalCharactersRegex)) {
			return;
		}
		super.insertString(offs, str, a);
	}
}
Zu suchenden Namen eingeben, im Datenfeld Namen hinzufügen / entfernen und Ergebnis betrachten. ;)
 

Curry

Aktives Mitglied
@Mizar: Das funktioniert sehr schön, doch fehlt die in meinem Startposting erwähnte "und/oder" Funktion. Aber das ist wahrscheinlich wirklich schwierig und deutlich aufwändiger. Auf jeden Fall schonmal vielen Dank. Das ist so schon richtig gut!
 

Mizar

Aktives Mitglied
Ah, genau, die "und / oder" Funktion. Habe meinen Code entsprechend angepasst, um nun mittels des '+'-Zeichens das Suchen nach mehreren Namen gleichzeitig zu ermöglichen. Alle Änderungen sind mit Kommentaren versehen.
Java:
public class Namesearcher
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame("Namesearcher");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        final JTextField searchField = new JTextField();
        final JTextField dataField = new JTextField();
        final JTextField resultField = new JTextField();
        // Nicht vergessen: Das "+ Zeichen" (oder ein entsprechendes anderes Zeichen) im Suchfeld erlauben.
        searchField.setDocument(new CertainCharactersDocument("[^\\p{Alpha}ÄÖÜäöüß\\+ -]"));
        dataField.setDocument(new CertainCharactersDocument("[^\\p{Alpha}ÄÖÜäöüß, -]"));
        DocumentListener docListener = new DocumentListener()
        {
            @Override
            public void removeUpdate(DocumentEvent e)
            {
                search();
            }
            
            @Override
            public void insertUpdate(DocumentEvent e)
            {
                search();
            }
            
            @Override
            public void changedUpdate(DocumentEvent e)
            {
                // empty
            }
            
            private void search()
            {
                String searchString = searchField.getText().trim();
                if(searchString.isEmpty()) {
                    resultField.setText("");
                } else {
                	Pattern pattern;
                	Matcher matcher;
                	// HashSet um mehrfach gefundene Treffer zu ignorieren.
                	HashSet<String> results = new HashSet<String>();
                	// Jeden Teilsuchstring einzeln auf das Datenfeld loslassen.
                	String[] searchStrings = searchString.split("\\+");
                	for(String currentSearchString: searchStrings) {
                		currentSearchString = currentSearchString.trim();
                		if(!currentSearchString.isEmpty()) {
		                    pattern = Pattern.compile("(?i)([^,]*\\b" + currentSearchString + "[^,]*)");
		                    matcher = pattern.matcher(dataField.getText());
		                    while(matcher.find()) {
		                    	results.add(matcher.group(1));
		                    }
                		}
                	}
                	// Alle Ergebnisse zu einem String zusammenfügen und ins Ergebnisfeld schreiben.
                    StringBuilder str = new StringBuilder();
                    for(String s: results) {
                    	str.append(s);
                    }
                    resultField.setText(str.toString());
                }
            }
        };
        searchField.getDocument().addDocumentListener(docListener);
        dataField.getDocument().addDocumentListener(docListener);
        dataField.setText("Müller P, Stolz KW, Nolte K, Schmidt HG, Mayer F");
        resultField.setEditable(false);
        
        Container container = frame.getContentPane();
        container.setLayout(new GridLayout(3, 2));
        container.add(new JLabel("Search for:"));
        container.add(searchField);
        container.add(new JLabel("Data:"));
        container.add(dataField);
        container.add(new JLabel("Result:"));
        container.add(resultField);
        
        frame.pack();
        frame.setVisible(true);
    }
}
 
class CertainCharactersDocument extends PlainDocument
{
    private static final long serialVersionUID = 8295705287949439607L;
    private String illegalCharactersRegex;
    
    public CertainCharactersDocument(String illegalCharactersRegex)
    {
        this.illegalCharactersRegex = illegalCharactersRegex;
    }
    
    @Override
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException
    {
        if(str.matches(illegalCharactersRegex)) {
            return;
        }
        super.insertString(offs, str, a);
    }
}
Sicherlich keine "Non plus ultra"-Lösung, aber soweit scheint es zu funktionieren und es dient dir vielleicht als Ideenansatz. :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Namen von Methoden über Reguläre Ausdrücke bearbeiten Allgemeine Java-Themen 6
E Reguläre Ausdrücke: String-Ersetzung Allgemeine Java-Themen 0
G Reguläre Ausdrücke Allgemeine Java-Themen 11
G Reguläre Ausdrücke Allgemeine Java-Themen 2
S Reguläre Ausdrücke: Polynomterme Allgemeine Java-Themen 14
jstei001 Reguläre Ausdrücke bearbeiten/ändern Allgemeine Java-Themen 14
F Reguläre Ausdrücke und BBCode Allgemeine Java-Themen 10
J String für reguläre Ausdrücke escapen Allgemeine Java-Themen 2
C Reguläre Ausdrücke - X{0}?.* Allgemeine Java-Themen 8
C Reguläre Ausdrücke, String rückwärts durchsuchen Allgemeine Java-Themen 6
I Reguläre Ausdrücke und das "~" Symbol Allgemeine Java-Themen 2
B Reguläre ausdrücke mit variablen? Allgemeine Java-Themen 12
H Regex - Reguläre Ausdrücke Allgemeine Java-Themen 3
A Reguläre Ausdrücke vereinfachen Allgemeine Java-Themen 19
J Reguläre Ausdrücke Allgemeine Java-Themen 14
A Zufallswerte für reguläre Ausdrücke Allgemeine Java-Themen 15
G Reguläre Ausdrücke Allgemeine Java-Themen 8
R reguläre Ausdrücke Allgemeine Java-Themen 2
L Reguläre Ausdrücke und Fehlerbehandlung Allgemeine Java-Themen 10
RaoulDuke Reguläre Ausdrücke - Daten extrahieren Allgemeine Java-Themen 3
L reguläre Ausdrücke? Allgemeine Java-Themen 2
R Reguläre Ausdrücke (mehrzeilig) Allgemeine Java-Themen 2
C Reguläre Ausrücke Punkte im Satz richtig erkennen Allgemeine Java-Themen 6
E Reguläre Txt in Tree parsen Allgemeine Java-Themen 2
J Reguläre Ausrücke - Klammer nicht vorhanden Allgemeine Java-Themen 2
B kontextfreie grammatik / reguläre grammatik Allgemeine Java-Themen 2
P reguläre ausrücke und String.matches Allgemeine Java-Themen 4
S Reguläre Ausdruecke! Allgemeine Java-Themen 5
A Lambda-Ausdrücke Allgemeine Java-Themen 5
M Lambada Ausdrücke - wie funktionieren und benutzt man sie? Allgemeine Java-Themen 5
S Lambda Ausdrücke: @FunctionalInterface Instanzen auf null prüfen Allgemeine Java-Themen 9
Z Design um boolsche ausdrücke zu speichern & auszuwerten Allgemeine Java-Themen 3
R Logische Ausdrücke in Java Allgemeine Java-Themen 4
Loyd Noch ne Regex-Frage: Verschachtelte Ausdrücke Allgemeine Java-Themen 4
H Geklammerte Ausdrücke nach Divide&Conquer Allgemeine Java-Themen 2
B Parser für logische Ausdrücke Allgemeine Java-Themen 9
J Expression Language für mathematische Ausdrücke Allgemeine Java-Themen 8
B Regeuläre Ausdrücke Allgemeine Java-Themen 8
G arithmetische ausdrücke Allgemeine Java-Themen 5
M Regular Expression - verschiedene Ausdrücke testen (grep | ) Allgemeine Java-Themen 5
N lwjgl kann textureSampler nicht finden Allgemeine Java-Themen 4
OnDemand MemoryLeak nicht zu finden Allgemeine Java-Themen 26
P Java Quellen finden Allgemeine Java-Themen 3
W RegEx Stringliteral finden - Jflex Allgemeine Java-Themen 5
A Mithilfe von einer Nummer einen Namen finden n-Beziehung Allgemeine Java-Themen 8
T JSoup findet input Feld nicht?! Wie kann ich das Feld finden? Allgemeine Java-Themen 3
B Quellcode einer Java libary finden um zu copy & paste'n Allgemeine Java-Themen 5
S Einzigartigen String in Datenbank finden und löschen Allgemeine Java-Themen 23
TheJavaKid Mit Java die Festplatte mit dem meisten freien Speicher finden Allgemeine Java-Themen 7
J Fahrroute zwischen zwei Punkten finden Allgemeine Java-Themen 1
A Applet Applet debuggen und Logs finden Allgemeine Java-Themen 3
H ArrayList: Leere Elemente finden? Allgemeine Java-Themen 2
X Sich wiederholende substrings finden Allgemeine Java-Themen 6
KeVoZ_ Bestimmte Zeile aus Console finden & auslesen Allgemeine Java-Themen 2
N Knoten mit kleinster Distanz finden Allgemeine Java-Themen 3
so_ein_Komischer Erste Schritte java Math Klasse finden? Allgemeine Java-Themen 2
E 3D Objekte in 2D Bild finden Allgemeine Java-Themen 5
M den richtigen COM-Port finden Allgemeine Java-Themen 1
B Muster in 2D-Array finden Allgemeine Java-Themen 4
F Punkte in einem Bild finden Allgemeine Java-Themen 10
E Tool um Methodenaufrufe aus bestimmten Pkg zu finden Allgemeine Java-Themen 2
K Referenzen finden Allgemeine Java-Themen 6
R Zusammenhängende Werte in 2-dim. Array finden und zählen Allgemeine Java-Themen 3
D Face.com - Gesicht im Bild finden Allgemeine Java-Themen 3
M Typ einer inneren Klasse mit reflections finden Allgemeine Java-Themen 7
A Methoden ohne Referenzen finden Allgemeine Java-Themen 9
D JNI->kann abhängige Bibliotheken einer DLL nicht finden Allgemeine Java-Themen 4
S main() class finden Allgemeine Java-Themen 7
K Eclipse Export - Bilder finden Allgemeine Java-Themen 7
A Signifikante Array-Indizes finden Allgemeine Java-Themen 3
D Wort in Text mit >100.000 Wörter finden Allgemeine Java-Themen 7
D Passende Name für Methoden finden Allgemeine Java-Themen 3
M Pfad in int[][] finden Allgemeine Java-Themen 4
D [debuggen] nich geschlossene Resource "finden" Allgemeine Java-Themen 5
P Windows Media Player starten / finden Allgemeine Java-Themen 2
S Outline um Rechtecke finden..? Allgemeine Java-Themen 4
S Dateipfad finden Allgemeine Java-Themen 2
S String in Datei finden und ersetzen Allgemeine Java-Themen 11
S groesstes Rechteck innerhalb eines Polygons/Shape finden..? Allgemeine Java-Themen 5
S String in Datei finden Allgemeine Java-Themen 5
H Buchstabe in String finden Allgemeine Java-Themen 3
J Länge einer ArrayList finden? Allgemeine Java-Themen 4
B logischen Fehler finden Allgemeine Java-Themen 4
B Annotationen finden Allgemeine Java-Themen 2
H RandomAccessFile - Zeile finden Allgemeine Java-Themen 5
H2SO3- jar soll eigenen namen(pfad) finden Allgemeine Java-Themen 12
S ResourceBundle: Locale Datei in Jar finden Allgemeine Java-Themen 3
megachucky Java Reflection -> versteckte Felder finden? Allgemeine Java-Themen 3
A alle nicht-dplikate finden Allgemeine Java-Themen 14
Landei Trick für Duplikate in Liste finden? Allgemeine Java-Themen 9
V exe finden? Allgemeine Java-Themen 7
T [Joda Time] Nächsten Samstag finden Allgemeine Java-Themen 8
B ProcessBuilder: kann Ordner im home nicht finden Allgemeine Java-Themen 2
G Ordner für Dateien finden Allgemeine Java-Themen 3
P Ungenutzte Klassen und Methoden finden Allgemeine Java-Themen 2
G die mittlere von 5 Zahlen nur mit if und else finden Allgemeine Java-Themen 48
C Speicherfresser finden? Allgemeine Java-Themen 9
E Doppelten Text in Datei finden? Allgemeine Java-Themen 11
S Relativen Pfad zu Pfad für File finden Allgemeine Java-Themen 4
C kürzester weg zwischen zwei Punkten, Koordinaten finden Allgemeine Java-Themen 15

Ähnliche Java Themen

Neue Themen


Oben