Suche mit Regular Expression

xeEEenon

Mitglied
Hi,

ich habe eine Liste von Wörtern und eine Suchfunktion der ich den gewünschten Suchbegriff übergebe.
Ich habe mir gedacht dass ich die Wörter mit einer Regular Expression prüfe und dann seperat speichere.

Beispiel: in der Liste ist das Wort "regular expression" und meiner Suchbegriff lautet "reg", wie bekomme ich dann alle Wörter die "reg" enthalten?

Gruß

Xen
 
Ich würde mal sagen, alle Zeichenketten die folgendes Muster besitzen:

1: " " (Leerzeichen)
*: a,b,c...XYZ
1: "reg"
*: a,b,c...XYZ
1: " " (Leerzeichen)

Zusammen basteln darfste selbst. ;)

Wobei da noch nicht der Fall drin ist, dass bspw. ein Komma oder ein Satzpunkt genau nach einem Wort kommt ..
 
Also ich würde sagen es kommt darauf an wie "gut" deine Suchfunktion werden soll. Wenn du z.B. nur Wörter suchen möchtest die mit dem gewünschten Suchbegriff anfangen, würde ich dir eher raten mit dem StringTokenizer die Wörter zu spliten und dann mit startsWith(String serach) zu arbeiten, wenn du natürlich auch die Char Reihenfolge "reg" in der Mitte des Wortes finden möchtest kommst du nicht mehr um RegEX herum...
mfg
elmato
 
Ich habe nun einen Teil der Lösung:

Code:
pattern = Pattern.compile( suchbegriff, Pattern.CASE_INSENSITIVE );
matcher = pattern.matcher( text );

if ( matcher.lookingAt() )
{
        // text gefunden
}


Nun habe ich nurnoch ein Problem, er sucht nur zu Beginn des Textes und nicht mitten im Text. Hat jemand ne Idee?

Gruß

Xen
 
Hallo!

Schau mal hier:
Code:
/**
  * 
  */
 package de.tutorials;
 
 import java.awt.BorderLayout;
 import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
 import java.text.MessageFormat;
 
 import javax.swing.AbstractListModel;
 import javax.swing.JFrame;
 import javax.swing.JList;
 import javax.swing.JTextField;
 import javax.swing.ListModel;
 
 /**
  * @author Tom
  * 
  */
 public class WordFilterExample extends JFrame {
 
 	JTextField textField;
 
 	FilterableJList list;
 
 	final static String DEFAULT_FILTER = "^#.*";
 
 	public WordFilterExample() {
 		super("WordFilterExample");
 		setDefaultCloseOperation(EXIT_ON_CLOSE);
 
 		textField = new JTextField(20);
 		textField.addKeyListener(new KeyAdapter() {
 			public void keyReleased(KeyEvent e) {
 				list
 					    .setFilter(DEFAULT_FILTER.replace("#", textField
 							    .getText()));
 				list.updateUI();
 			}
 		});
 
 		list = new FilterableJList(createDummyData());
 
 		add(textField, BorderLayout.NORTH);
 		add(list, BorderLayout.CENTER);
 
 		pack();
 		setVisible(true);
 	}
 
 	private Object[] createDummyData() {
 		return new Object[] { "a", "b", "ba", "bac", "bbc", "c" };
 	}
 
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) {
 		new WordFilterExample();
 	}
 
 	class FilterableJList extends JList {
 
 		String filter;
 
 		FilteredListModel filteredListModel;
 
 		int currentFilterMatches;
 
 		int[] currentFilterMapping;
 
 		String TOOLTIP_MESSAGE = "{0} Items filtered out of {1}";
 
 		public FilterableJList(Object[] data) {
 			super(data);
 		    filteredListModel = new FilteredListModel(super.getModel(), null);
 		}
 
 		public String getFilter() {
 			return filter;
 		}
 
 		public void setFilter(String filter) {
 			this.filter = filter;
 		}
 
 		private void doFilter() {
 			ListModel model = super.getModel();
 			int modelSize = model.getSize();
 			int[] tmpMapping = new int[modelSize];
 
 			currentFilterMatches = 0;
 			for (int i = 0; i < modelSize; i++) {
 			    if (model.getElementAt(i).toString().matches(this.filter)) {
 				    tmpMapping[currentFilterMatches++] = i;
 				}
 			}
 
 			currentFilterMapping = new int[currentFilterMatches];
 			System.arraycopy(tmpMapping, 0, currentFilterMapping, 0,
 				    currentFilterMatches);
 			filteredListModel.setFilterMapping(currentFilterMapping);
 		}
 
 		public ListModel getModel() {
 			if (filter == null || filter.equals("")) {
 				setToolTipText("");
 				return super.getModel();
 			} else {
 				doFilter();
 			    setToolTipText(MessageFormat.format(TOOLTIP_MESSAGE,
 					    new Object[] { Integer.valueOf(currentFilterMatches),
 							    Integer.valueOf(super.getModel().getSize()) }));
 				return filteredListModel;
 			}
 		}
 	}
 
 	class FilteredListModel extends AbstractListModel {
 
 		ListModel delegate;
 
 		int[] filterMapping;
 
 		public FilteredListModel(ListModel delegate, int[] filterMapping) {
 			this.delegate = delegate;
 			this.filterMapping = filterMapping;
 		}
 
 		public int getSize() {
 		    return this.filterMapping != null ? this.filterMapping.length : 0;
 		}
 
 		public Object getElementAt(int index) {
 			return delegate.getElementAt(filterMapping[index]);
 		}
 
 		public ListModel getDelegate() {
 			return delegate;
 		}
 
 		public void setDelegate(ListModel delegate) {
 			this.delegate = delegate;
 		}
 
 		public int[] getFilterMapping() {
 			return filterMapping;
 		}
 
 		public void setFilterMapping(int[] filterMapping) {
 			this.filterMapping = filterMapping;
 		}
 	}
 }
Beispiel zum Filtern von Daten einer JList.

Gruss Tom
 
So habe nun selbst etwas gefunden, hier die Lösung:

Code:
pattern = Pattern.compile( suchbegriff, Pattern.CASE_INSENSITIVE );
matcher = pattern.matcher( text );

if ( matcher.find() )
{
        // text gefunden
}
 
Zurück