到目前为止,展示的大多数例子中,正则表达式都是应用于静态字符串的。下面的例子展示
了使用正则表达式在文件中搜寻匹配的一种方法。受 Unix 的 grep 的启发,JGrep.java
接受两个参数:一个文件名及我们想要匹配的正则表达式。输出结果显示发生匹配的所有行
以及在行内的匹配位置。
//:c12:JGrep.java
// A very simpleversion of the "grep" program.
// {Args:JGrep.java "\\b[Ssct]\\w+"}
importjava.io.*;
importjava.util.regex.*;
importjava.util.*;
importcom.bruceeckel.util.*;
public classJGrep {
public static void main(String[] args)throws Exception {
if(args.length < 2) {
System.out.println("Usage: javaJGrep file regex");
System.exit(0);
}
Pattern p = Pattern.compile(args[1]);
// Iterate through the lines of theinput file:
ListIterator it = newTextFile(args[0]).listIterator();
while(it.hasNext()) {
Matcher m = p.matcher((String)it.next());
while(m.find())
System.out.println(it.nextIndex() +": " +
m.group() + ": " +m.start());
}
}
} ///:~
在上例中,文件被作为一个 TextFile 对象(在本章前面已经介绍过)打开。由于一个 TextFile
对象内部的ArrayList 包含了文件中的行,由这个数组可以产生一个 ListIterator。因此,
其结果是一个可以让我们在文件的行之间进行移动(向前向后)的迭代器。
每个输入行都被用来产生一个 Matcher,并可以用 find()浏览结果。注意
ListIterator.nextIndex()用于跟踪行号。
测试参数打开 JGrep.java 文件,将其读入作为输入,然后搜索以[Ssct]开始的单词