Java 正则表达式的用法及详细介绍

以下内容部分来自 疯狂Java讲义/李刚 ,博客仅用于个人笔记及帮助他人用途,无任何商业目的,如有侵权,请联系作者删除。

Java 正则表达式的介绍

正则表达式是一个强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作。String类里也提供了如下几个特殊的方法。
(1)boolean matches(String regex):判断该字符串是否匹配指定的正则表达式。
(2)String replaceAll(String regex,String replacement):将该字符串中所有匹配 regex 的了串替换成replacement。
(3)String replaceFirst(String regex,String replacement):将该字符串中第一个匹配regex的子串替换成replacement。
(4)String Llsplit(String regex):以regex作为分隔符,把该字符串分割成多个子串。
上面这些特殊的方法都依赖于Java提供的正则表达式支持,除此之外,Java还提供了Pattern和Matcher两个类专门用于提供正则表达式支持。

创建正则表达式

正则表达式是一个可以用于匹配字符串的模板,可以匹配一批字符串,所以创建正则表达式就是创建一个特殊的字符串,规则如下:

正则表达式所支持的合法字符
正则表达式所支持的合法字符

除此之外,正则表达式中有一些特殊字符,这些字符在正则表达式中有特殊的用途,比如反斜线(\)。如果需要匹配这些字符,就必须首先将这些字符转义。也就是在前面加一个反斜线()。

正则表达式中的特殊字符
正则表达式中的特殊字符

预定义字符
预定义字符

方括号表达式
方括号表达式

正则表达式还支持圆括号表达式,用于将多个表达式组成一个子表达式,圆括号中可以使用或运算符(|)。
除此之外,Java 正则表达式还支持如下表的几个边界匹配符:

边界匹配符
边界匹配符

正则表达式还提供了数量标识符,正则表达式支持的数量标识符有如下几种模式:
Greedy(贪婪模式): 数量表示符默认采用贪婪模式,除非另有表示。贪婪模式的表达式会一直匹配下去,直到无法匹配为止。如果你发现表达式匹配的结果与预期的不符,很有可能是因为你以为表达式只会匹配前面几个字符,而实际上它是贪婪模式,所以会一直匹配下去·
Reluctant(勉强模式): 用问号后缀(?)表示,它只会匹配最少的字符。也称为最小匹配模式
Possessive(占有模式): 用加号后缀(+)表示,目前只有Java支持占有模式,通常比较少用·

三种模式的数量表示符如下
三种模式的数量表示符

使用正则表达式

一旦在程序中定义了正则表达式,就可以使用 Pattern 和 Matcher 来使用正则表达式。Pattern 对象是正则表达式编译后在内存中的表示形式,因此,正则表达式字符串必须先被编译为 Pattern 对象,然后再利用该 Pattern 对象创建对应的 Matcher 对象。执行匹配所涉及的状态保留在 Matcher 对象中,多个 Matcher 对象可共享同一个Pattern对象。
因此,典型的调用顺序如下:
Pattern p = Pattern.compile(“a*b”);
Matcher m = p.matcher(“aaaaab”);
boolean b = m.matches();
上面定义的 Pattern 对象可以多次重复使用。如果某个正则表达式仅需一次使用,则可以使用 Pattern 类的静态方法 matches 方法,此方法自动把指定的字符串编译成匿名的 Pattern 对象,并执行匹配,如下:
boolean b = Pattern.matches(“a*b”,”aaaaab”);//返回 true
上面语句等效于前面的三条语句,但采用这种语句每次都需要重新编译新的 Pattern 对象,不能重复利用己编译的 Pattern 对象,所以效率不高。

Pattern 是不可变类,可供多个并发线程安全使甩。
Matcher 类提供了如下几个常用方法。
(1)find() :返回目标字符串中是否包含与 Pattern匹配的了串。
(2)group():返回上一次与 Pattern 匹配的子串。
(3)start():返回上一次与Pattern匹配的子串在目标字符串中的开始位置。
(4)end():返回上次与Pattern匹配的子串在目标字符串中的结束位置加1。
(5)lookingAt():返回目标字符串前面部分与 Pattern 是否匹配。
(6)matches():返回整个目标字符串与Pattern是否匹配。
(7)reset(),将现有的 Matcher 对象应用于一个新的字符序列。
在 Pattern、Matcher 类的介绍中经常会看到一个Charsequence接口,该接口代表一个字符序列,其中CharBuffer、String、StringBuffer、StringBuilder都是它的实现类。简单地说,CharSequence代表一个各种表现形式的字符串。
通过Matcher类的 find()和 group()方法可以从目标字符串中依次取出特定子串(匹配正则表达式的子串)。

下面附上一个使用正则表达式匹配出从百度图片的搜索结果中的图片链接的 java 程序。

import java.util.regex.*;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class GetImgList{

  public static void GetResponse(final String strUrl,final HttpCallbackListener callBack){
    new Thread(new Runnable(){
      @Override
      public void run(){
        HttpURLConnection connection=null;
                        try {
                            URL url=new URL(strUrl);
                            connection=(HttpURLConnection)url.openConnection();
                            connection.setRequestMethod("GET");
                            connection.setConnectTimeout(8000);
                            connection.setReadTimeout(8000);
                            //connection.setDoInput(true);
                            //connection.setDoOutput(true);

                            InputStream in=connection.getInputStream();
                            BufferedReader reader=new BufferedReader(new InputStreamReader(in));
                            StringBuilder response=new StringBuilder();
                            String line;
                            while((line=reader.readLine())!=null){
                                response.append(line);
                            }
                            if(callBack!=null){
                                callBack.onFinish(response.toString());
                            }

                        } catch (Exception e) {
                            if(callBack!=null){
                                callBack.OnError(e);
                            }
                        }finally{
                            if(connection!=null){
                                connection.disconnect();
                            }
                        }
      }
    }).start();

  }

  interface HttpCallbackListener{
    void onFinish(String response);
    void OnError(Exception e);
  }
  public static void main(String[] args){
    String url="http://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1"+
    "&cl=2&ie=gbk&word=%C8%FD%F3%D2&fr=ala&"+
    "ori_query=%E4%B8%89%E7%AC%A0&ala=0&alatpl=sp&pos=0";
    System.out.println("This URL is: "+url);
    GetImgList.GetResponse(url,
      new HttpCallbackListener(){
        public void onFinish(String response){
          final Pattern p = Pattern.compile("http://img\\d\\.(.{35,60}).jpg");
          Matcher matcher = p.matcher(response);
          while(matcher.find()){
              System.out.println(matcher.group());
          }
        }
        public void OnError(Exception e){
            System.out.println(e.toString());
        }
      });
  }
}

猜你喜欢

转载自blog.csdn.net/u013872857/article/details/50609721