package zap;
import java.util.*;
import java.util.regex.*;
import java.io.*;
import java.lang.StringBuffer;
public class MaskFind {
private String fileName;
private String inMask;
private String mask;
private Scanner scanner;
private Pattern pattern;
private BufferedReader reader;
public MaskFind(String mask, String fileName) {
this.fileName = fileName;
this.inMask = mask;
}
/**
* Hlavní metoda
*/
public void process() {
if (!openFile()) return;
mask = "^"+maskTranslate(inMask)+"$";
System.out.println("mask : "+inMask);
System.out.println("regex: "+mask);
pattern = Pattern.compile(mask);
boolean maskFirst = inMask.startsWith("<");
boolean maskLast = inMask.endsWith(">");
mask = "^"+mask+"$";
String word;
int line = 0;
String tx;
boolean firstWord;
try {
// bereme radek po radku
while ((tx = reader.readLine()) != null) {
line++;
firstWord = true;
scanner = new Scanner(tx);
// bereme slovo za slovem na aktualnim radku
while (scanner.hasNext()) {
word = scanner.next();
if (maskFirst && !firstWord) {
// preskocit, neni to prvni slovo na radku
}
else if (maskLast && scanner.hasNext()) {
// preskocit, neni to posledni slovo na radku
}
else if (wordMatch(word))
System.out.println(line+": "+word);
firstWord = false;
}
}
}
catch (Exception e) {
System.out.println("I/O error: "+fileName);
return;
}
}
/**
* Otevře soubor
*/
private boolean openFile() {
try {
reader = new BufferedReader(new FileReader(fileName));
}
catch (IOException e) {
System.out.println("Unable to open file: "+fileName);
return false;
}
return true;
}
/**
* Matchuje jedno slovo
*/
private boolean wordMatch(String word) {
Matcher matcher = pattern.matcher(word);
if (matcher.find()) return true;
return false;
}
/**
* Přeloľí masku do regexp výrazu
*/
private String maskTranslate(String mask) {
boolean bslash = false;
int i;
StringBuffer buf = new StringBuffer();
char[] chars = mask.toCharArray();
for (i=0; i < chars.length; i++) {
if (bslash) {
bslash = false;
buf.append(chars[i]);
continue;
}
switch (chars[i]) {
case '*':
buf.append(".*");
break;
case '?':
buf.append(".?");
break;
case '#':
buf.append("[0123456789]");
break;
case '<':
break;
case '>':
break;
case '^':
buf.append("\\^");
break;
case '$':
buf.append("\\$");
break;
case '\\':
buf.append("\\");
bslash = true;
break;
default:
buf.append(chars[i]);
break;
}
}
return buf.toString();
}
public static void main(String[] args) {
if (args.length != 2) {
System.out.println("MaskFind <maska> <soubor>");
System.exit(1);
}
MaskFind mf = new MaskFind(args[0],args[1]);
mf.process();
}
}