ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
### [用正则表达式扫描](https://lingcoder.gitee.io/onjava8/#/book/18-Strings?id=%e7%94%a8%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f%e6%89%ab%e6%8f%8f) 除了能够扫描基本类型之外,你还可以使用自定义的正则表达式进行扫描,这在扫描复杂数据时非常有用。下面的例子将扫描一个防火墙日志文件中的威胁数据: ~~~ // strings/ThreatAnalyzer.java import java.util.regex.*; import java.util.*; public class ThreatAnalyzer { static String threatData = "58.27.82.161@08/10/2015\n" + "204.45.234.40@08/11/2015\n" + "58.27.82.161@08/11/2015\n" + "58.27.82.161@08/12/2015\n" + "58.27.82.161@08/12/2015\n" + "[Next log section with different data format]"; public static void main(String[] args) { Scanner scanner = new Scanner(threatData); String pattern = "(\\d+[.]\\d+[.]\\d+[.]\\d+)@" + "(\\d{2}/\\d{2}/\\d{4})"; while(scanner.hasNext(pattern)) { scanner.next(pattern); MatchResult match = scanner.match(); String ip = match.group(1); String date = match.group(2); System.out.format( "Threat on %s from %s%n", date,ip); } } } /* Output: Threat on 08/10/2015 from 58.27.82.161 Threat on 08/11/2015 from 204.45.234.40 Threat on 08/11/2015 from 58.27.82.161 Threat on 08/12/2015 from 58.27.82.161 Threat on 08/12/2015 from 58.27.82.161 */ ~~~ 当`next()`方法配合指定的正则表达式使用时,将找到下一个匹配该模式的输入部分,调用`match()`方法就可以获得匹配的结果。如上所示,它的工作方式与之前看到的正则表达式匹配相似。 在配合正则表达式使用扫描时,有一点需要注意:它仅仅针对下一个输入分词进行匹配,如果你的正则表达式中含有分隔符,那永远不可能匹配成功。