# Reguläre Ausdrücke - maskieren von Zeichen?



## muemmel_0811 (17. Aug 2007)

Hi zusammen,

ich kapier leider das wann und was Maskieren der Sonderzeichen noch nicht so wirklich, wenn ich nach einem regulären Ausdruck suche.
Bspw. möchte ich diesen kleinen String in ca. 15.000 html-Dateien suchen: name="navoben"
Mit RegexBuddy erhalte ich 6890 Treffer und mit meinem kleinen Java-Prog 6897 Treffer. Ich weiß der Unterschied ist nicht so vehement, aber trotzdem ist er da...

Hier der relevante Code-Teil:

```
String regMus = p.txtSuch.getText();
Pattern pa = Pattern.compile(regMus, Pattern.CASE_INSENSITIVE);
Matcher ma = pa.matcher(p.taHtml.getSelectedText());
```
Muss ich jetzt " maskieren oder nicht und wenn ja, wieviele \ brauch ich dafür?
Gibt's außerdem irgendwo eine Übersicht welche Zeichen generell maskiert werden müssen?

Danke und Grüße,
muemmel


----------



## SlaterB (17. Aug 2007)

\\ für das \
\" für das "

also \\\"


----------



## bygones (17. Aug 2007)

im grunde recht einfach... alle sonderzeichen (ich nenns mal so) muessen maskiert werden..

also die ganzen regex zeichen wie + * . \ [ usw.


----------



## muemmel_0811 (17. Aug 2007)

Danke Euch beiden, aber irgendwie kapier ich's nicht...
wenn ich nach \\\"navoben\\\" suche bekomm ich 0 Treffer, wenn ich nach \"navoben\" suche sind's 6897, also genau soviele wie bei "navoben"  ???:L 

Und was ich ja so gar nicht verstehe ist, sind die Abweichungen zwischen RegexBuddy und meinem kleinen Prog...
hier mal der gesamte Code:

```
package pack;

import java.awt.*;
import java.awt.event.*;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.*;

public class Suche extends JFrame{
	private static final long serialVersionUID = 1L;
	Pan p = new Pan();
	
	Suche() {
		super();
		setTitle("Suche");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		initLaF();
		setLayout(new BorderLayout());
		getContentPane().add(p, BorderLayout.CENTER);
	}
	
	public class Pan extends JPanel {
		private static final long serialVersionUID = 1L;
		JLabel lblDir = new JLabel("Verzeichnis:");
		JTextField txtDir = new JTextField();
		JButton btnDir = new JButton("...");
		JLabel lblSuch = new JLabel("Suche:");
		JTextField txtSuch = new JTextField();
		JLabel lblRep = new JLabel("Ersetze:");
		JTextField txtRep = new JTextField();
		JButton btnGo = new JButton("go !");
		JTextArea taHtml = new JTextArea(10,40);
		JScrollPane scroll = new JScrollPane();

		
		
		Pan() {
			super();
			setLayout(null);
			lblDir.setBounds(10,10,60,20);
			add(lblDir);
			txtDir.setBounds(80,10,560,20);
			add(txtDir);
			btnDir.setBounds(650,10,30,20);
			add(btnDir);
			btnDir.addActionListener(new GetDir());
			lblSuch.setBounds(10,50,60,20);
			add(lblSuch);
			txtSuch.setBounds(80,50,560,20);
			add(txtSuch);
			lblRep.setBounds(10,80,60,20);
			add(lblRep);
			txtRep.setBounds(80,80,560,20);
			add(txtRep);
			btnGo.setBounds(20,110,100,30);
			add(btnGo);
			btnGo.addActionListener(new ButGo());
			scroll.setBounds(10,160,670,300);
			scroll.setViewportView(taHtml);
			add(scroll);
		}
	}
	
	class GetDir implements ActionListener{
		public void actionPerformed(ActionEvent ae) {
			JFileChooser fc = new JFileChooser();
			fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
			int option = fc.showOpenDialog(p);
			if(option == JFileChooser.APPROVE_OPTION) {
				String pfad = fc.getSelectedFile().getAbsolutePath();
				p.txtDir.setText(pfad);
			}
		}
	}
	
	class ButGo implements ActionListener {
		public void actionPerformed(ActionEvent ae) {
			String x = p.txtDir.getText();
			Pattern pat = Pattern.compile("\\\\");
			Matcher mat = pat.matcher(x);
			if(mat.find() == true) {
				String resPfad = mat.replaceAll("\\\\\\\\");
				File f = new File(resPfad);
				listen(f);
				System.out.println("###############################\nFERTIG!\n################################");
			}
		}
	}
	
	class DateiFilter implements FileFilter {
		private String ende1, ende2, ende3, ende4;
		public DateiFilter(String endung1, String endung2, String endung3, String endung4) {
			ende1 = endung1;
			ende2 = endung2;
			ende3 = endung3;
			ende4 = endung4;
		}
		public boolean accept(File dat) {
			if(dat.isDirectory() == true) {
				return true;
			}
			else {
				if(dat.getName().endsWith(ende1) == true || 
					dat.getName().endsWith(ende2) == true ||
					dat.getName().endsWith(ende3) == true ||
					dat.getName().endsWith(ende4) == true) {
					return true;
				}
				else {
					return false;
				}
			}
		}
	}
	
	int cnt = 0;
	int cntG = 0;
	void listen(File dir) {
		DateiFilter filter = new DateiFilter(".html",".htm",".HTML", ".HTM");
		File[] dateien = dir.listFiles(filter);
		if(dateien != null) {
			for(int i=0; i<dateien.length; i++) {
				if(dateien[i].isDirectory()) {
					listen(dateien[i]);
				}
				if(dateien[i].isFile() && dateien[i].length() < 1000000) {
					cntG++;
					try {
						BufferedReader rein = new BufferedReader(new FileReader(dateien[i]));
						StringBuffer puffer = new StringBuffer();
						String zeile;
						while((zeile = rein.readLine()) != null) {
							puffer.append(zeile);
							puffer.append('\n');
						}
						rein.close();
						String inhalt = new String(puffer);
						p.taHtml.setText("");
						p.taHtml.setText(inhalt);
						p.taHtml.setCaretPosition(0);
						p.taHtml.selectAll();
						String regMus = p.txtSuch.getText();
						String repText = p.txtRep.getText();
						Pattern pa = Pattern.compile(regMus, Pattern.CASE_INSENSITIVE);
						Matcher ma = pa.matcher(p.taHtml.getSelectedText());
						if(ma.find() == true) {
							cnt++;
						}
					}
					catch(Exception e) {
						e.printStackTrace();
					}
				}
			}
		}
		System.out.println("Dateien gefunden: " + cnt + " - Dateien gesamt: " + cntG);
	}
	
	
	
	public void initLaF() {
		try {
			UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
			SwingUtilities.updateComponentTreeUI(this);
			SwingUtilities.updateComponentTreeUI(p);
		}
		catch(Exception c){
		}
	}
	public static void main(String[] args) {
		Suche fm = new Suche();
		fm.setSize(700,500);
		fm.setLocation(270,140);
		fm.setVisible(true);
		fm.setResizable(false);
	}
}
```

Und ja, ich weiß, dass ich das 2. Textfeld gerade nicht benutze - bin aber zu faul jedes mal die GUI umzubasteln, nur um was auszuprobieren...

Grüße,
muemmel


----------



## Wildcard (17. Aug 2007)

Setz bitte kein Windows L'n'F, sondern das System L'n'F. Sonst ist die Anwendung nur auf Windows lauffähig.


----------



## muemmel_0811 (17. Aug 2007)

Hallo Wildcard,

Danke für den Hinweis, aber das macht in diesem Falle gar nix, da ich das Tool nur in der Arbeit brauch und da gibt's nur Windows...
Aber soweit mir bekannt schaltet Java das L'n'F doch automatisch auf das Java-L'n'F, falls es sich um ein anderes OS handelt - mein ich zumindest mal irgendwo gelesen zu haben.

Grüße,
muemmel


----------



## Wildcard (17. Aug 2007)

Naja, du bekommst eine ClassNotFoundException und die Anweisung wird dementsprechend nicht ausgeführt, aber es würde dir kein Zacken aus der Krone fallen wenn du dir direkt UIManager.getSystemLookAndFeelClassName angewöhnen würdest.


----------



## muemmel_0811 (17. Aug 2007)

OK, hast Recht!
Zu meiner Schande muss ich ja gestehen, dass ich UIManager.getSystemLookAndFeelClassName noch nicht über den Weg gelaufen bin   

Aber was ist denn mit meinem eigentlichen Problem - kannst Du mir sagen, warum ich in RegexBuddy ein paar weniger Treffer hab, als mit meinem kleinen Prog?

Grüße,
muemmel


----------



## SlaterB (17. Aug 2007)

Tipp: untersuche die ersten 3000 Zeilen und die zweiten 3000,
da wo noch ein Unterschied besteht, untersuche jeweils 1500,
750
375
190
100
50
25
13
7
4
2
1
dann hast du die Zeile, in der mal x und mal y Treffer gefunden wird,
poste diese Zeile

falls die Zeile aus über 1000 Zeichen besteht, weißt du ja, wie du wieder vorgehen musst 

edit: sind nicht 6000 Zeilen, sondern 15.000 Dateien, aber ist das gleiche Spiel


----------



## muemmel_0811 (17. Aug 2007)

Hi zusammen,

so, jetzt hab ich ca. 1,5 h damit verballert, den Unterschied zwischen meinem kleinen Prog und RegexBuddy (manuell) zu finden - und siehe da: mein Prog funktioniert einwandfrei!!!
Es ist RegexBuddy, was bei mir die Probleme verursacht. Und zwar durchsucht RegexBuddy nur Dateien, die nicht mit "backup" im Dateinamen beginnen und was soll ich sagen, natürlich haben wir auf unserem Server ein paar Dateien, die mit diesem Wörtchen beginnen...

Also, alle Aufregung umsonst und ich kann wieder beruhigt weiter regexen 

Danke noch mal an alle!
muemmel


----------

