码迷,mamicode.com
首页 > 编程语言 > 详细

Java对正则表达式的支持(二)

时间:2015-05-17 20:12:55      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:

  正则表达式的主要用途:

  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

 

Java对正则表达式的支持(二)

标签:

原文地址:http://www.cnblogs.com/lnlvinso/p/4510163.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!