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 "); System.exit(1); } MaskFind mf = new MaskFind(args[0],args[1]); mf.process(); } }