标签:
正则表达式的主要用途:
a.在目标字符串中找出匹配正则表达式的部分
b.校验目标字符串是否符合正则表达式,例如校验邮箱地址
c.在目标字符串中替换符合正则表达式的部分为其他的字符串
Scanner类是JDK 1.5中引入的扫描类,Scanner类的构造函数可以接受一个Readable对象,具体说来可以是File、String、InputStream等。
下面是一个Scanner类配合正则表达式使用的例子,目的是找出以S、s、c、t开头的单词。
package RegexTest; import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ScannerTest { public static void main(String [ ] args) throws FileNotFoundException { Pattern pa = Pattern.compile("\\b[Ssct]\\w+"); Matcher ma = pa.matcher(""); Scanner sc = new Scanner(new File("src/RegexTest/ScannerTest.java")); while(sc.hasNextLine()){ ma.reset(sc.nextLine()); while(ma.find()){ System.out.println(ma.group()); } } } }
输出结果为:
Scanner class ScannerTest static String throws compile Ssct Scanner sc Scanner src ScannerTest sc sc System
正则表达式"\\b[Ssct]\\w+"的含义如下,\b表示单词的边界,使用正则表达式操作单词时需要使用\b。w代表的是0-9或者a-z或者A-Z。
sc.hasNextLine()可以判断Scanner是否能取到下一行,sc.nextLine()是取下一行的字符串。
Scanner还有hasNextInt()、hasNextLong()、hasNextBigInteger()等方法用于取出下一个基本类型。
Scanner默认地是根据空格来分割输入的字符串,也可以自定义分割符,如下面所示。
import java.util.Scanner; public class ScannerTest2 { public static void main(String [ ] args) { String str = "12,42 , 78 ,99, 42"; Scanner sc = new Scanner(str); sc.useDelimiter("\\s*,\\s*"); while(sc.hasNextInt()){ System.out.println(sc.nextInt()); } } }
输出结果为:
12 42 78 99 42
sc.useDelimiter("\\s*,\\s*");中的\s代表空白符(空格,回车,换行等),*代表一个或多个,合起来就是“,”前后带任意个空白符。
Scanner除了可以配合Pattern和Matcher使用外,其本身也是支持正则表达式的,如下面的例子。
package RegexTest; import java.util.Scanner; import java.util.regex.MatchResult; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ScannerTest3 { public static void main(String [ ] args) { String str = "58.77.82.161@02/10/2012\n" + "204.17.82.31@02/11/2012\n" + "58.77.32.53@02/12/2012\n" + "28.45.32.161@02/12/2012\n"; Scanner sc = new Scanner(str); String pattern = "(\\d+\\.\\d+\\.\\d+\\.\\d+)@"+ "(\\d{2}/\\d{2}/\\d{4})"; while(sc.hasNext(pattern)){ sc.next(pattern); MatchResult mr = sc.match(); String ip = mr.group(1); String date = mr.group(2); System.out.format("Threat on %s from %s\n",date,ip); } Pattern pa = Pattern.compile("(\\d+\\.\\d+\\.\\d+\\.\\d+)@"+ "(\\d{2}/\\d{2}/\\d{4})",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); Matcher matcher = pa.matcher(str); while(matcher.find()){ String ip = matcher.group(1); String date = matcher.group(2); System.out.format("Threat on %s from %s\n",date,ip); } } }
输出结果为:
Threat on 02/10/2012 from 58.77.82.161 Threat on 02/11/2012 from 204.17.82.31 Threat on 02/12/2012 from 58.77.32.53 Threat on 02/12/2012 from 28.45.32.161 Threat on 02/10/2012 from 58.77.82.161 Threat on 02/11/2012 from 204.17.82.31 Threat on 02/12/2012 from 58.77.32.53 Threat on 02/12/2012 from 28.45.32.161
标签:
原文地址:http://www.cnblogs.com/lnlvinso/p/4510163.html