ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### [正则表达式与 Java I/O](https://lingcoder.gitee.io/onjava8/#/book/18-Strings?id=%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f%e4%b8%8e-java-io) 到目前为止,我们看到的例子都是将正则表达式用于静态的字符串。下面的例子将向你演示,如何应用正则表达式在一个文件中进行搜索匹配操作。`JGrep.java`的灵感源自于 Unix 上的*grep*。它有两个参数:文件名以及要匹配的正则表达式。输出的是每行有匹配的部分以及匹配部分在行中的位置。 ~~~ // strings/JGrep.java // A very simple version of the "grep" program // {java JGrep // WhitherStringBuilder.java 'return|for|String'} import java.util.regex.*; import java.nio.file.*; import java.util.stream.*; public class JGrep { public static void main(String[] args) throws Exception { if(args.length < 2) { System.out.println( "Usage: java JGrep file regex"); System.exit(0); } Pattern p = Pattern.compile(args[1]); // Iterate through the lines of the input file: int index = 0; Matcher m = p.matcher(""); for(String line: Files.readAllLines(Paths.get(args[0]))) { m.reset(line); while(m.find()) System.out.println(index++ + ": " + m.group() + ": " + m.start()); } } } /* Output: 0: for: 4 1: for: 4 */ ~~~ `Files.readAllLines()`返回一个`List<String>`对象,这意味着可以用*for-in*进行遍历。虽然可以在`for`循环内部创建一个新的`Matcher`对象,但是,在循环体外创建一个空的`Matcher`对象,然后用`reset()`方法每次为`Matcher`加载一行输入,这种处理会有一定的性能优化。最后用`find()`搜索结果。 这里读入的测试参数是`JGrep.java`文件,然后搜索以`[Ssct]`开头的单词。 如果想要更深入地学习正则表达式,你可以阅读 Jeffrey E. F. Friedl 的《精通正则表达式(第2版)》。网络上也有很多正则表达式的介绍,你还可以从 Perl 和 Python 等其他语言的文档中找到有用的信息。