您的位置:首页 > 职场人生

黑马程序员--java基础--正则表达式总结

2014-02-24 21:04 525 查看
------- android培训java培训、期待与您交流! ----------
目录:1.正则概述  2.常用符号及易错点 3.正则使用 4.String类中的正则  

1.正则概述

 

Pattern:正则表达式的编译表示形式
             指定为字符串的正则表达式必须首先被编译为此类的实例。

     Matcher:通过解释
Pattern
对执行字符串匹配操作的引擎。

             执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。

    典型的调用顺序:

            String  regex =\\w+@\\w+[.]((com)|(cn));

         String  str  =  "xxxxxxxxxxxxxx";

     Pattern p = Pattern.compile(regex);

     Matcher m = p.
matcher
(str);

     boolean b = m.
matches
();

     仅使用一次正则表达式时,可以方便地通过此类定义
matches
方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句

     boolean b = Pattern.matches(regex,str);

     等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。

    

2.常用符号及易错点 

     1.  . 匹配单个字符    * 匹配0至多个在它之前的字符    + 匹配前面的子表达式一次或多次     

        ?匹配前面的子表达式零次或一次      | 将两个匹配表达式做或运算

     2. [ ]匹配括号中的任意一个字符      { } 匹配次数     

        () 将()之间括起来的表达式定义为组group,从左到右计算其开括号来编号。

        将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。

     3. ^  匹配一行的开始 ^spring       $匹配一行的结束 SPRING$

     4. 组:这个概念很重要,组是用括号划分的正则表达式,可以通过编号来引用组。

        组号从0开始,有几对小括号就表示有几个组,并且组可以嵌套,

        组号为0的表示整个表达式,组号为1的表示第一个组,依此类推。

        例如:A(B)C(D)E正则式中有三组,组0是ABCDE,组1是B,组2是D;

       A((B)C)(D)E正则式中有四组:组0是ABCDE,组1是BC,组2是B;组3是C,组4是D。

 

     易错点:

     \ 的使用:在其他语言中,\\表示要插入的是一个字符,java中\\表示要插入的是正则表达式中的反斜线,

             与后面的字符连在一起有特殊意义,如\\d,\\w等。

          如何在java的正则中插入一个\字符:代码为\\\\,因为在java中\\表示一个\。

          但是如果在java中使用回车换行等,则不需要多添加反斜线了,如回车直接为\r。

   

3.正则使用

   
 a.Matcher类的方法:

       boolean matches():尝试将整个区域与正则匹配

       boolean find():尝试查找与该模式匹配的下一个子序列          

       String group():返回由以前匹配操作所匹配的输入子序列
       Matcher reset():重置匹配器,依然对原序列进行匹配
       Mathcer reset(CharSequence input):重置此具有新输入序列的匹配器,对新的输入序列进行匹配
代码如下:
public static void main(String[] args) throws IOException {
//      定义正则并获取匹配器:
String regex = "(\\w)+[\\.](\\w)+[\\.]((com)|(cn))";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher("");
System.out.println(matcher.matches());
//      打开网络资源
URL url = new URL("http://www.hao123.com/");
URLConnection urlConnection = url.openConnection();
InputStream ips = urlConnection.getInputStream();
BufferedReader bufr = new BufferedReader(new InputStreamReader(ips));
String line = null;
//      对网络内容进行匹配并输出符合匹配模式的字符串,注意每一行都要重置具有新输入序列匹配器
while((line=bufr.readLine())!=null){
//对新输入序列进行重新匹配
matcher.reset(line);
while(matcher.find()){

4000
System.out.println(matcher.group());
}
}
//      关闭网络资源
ips.close();

4.String类中的几个正则方法            

   个人理解为String类中关于正则的几个方法是为了使用方便而定义,不需要每次都去获取匹配器。

   总共有以下方法:

   boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。

代码示例:

System.out.println("--------检验是否符合QQ号码规则----------");
获取输入的QQ字符串
String strNum = new Scanner(System.in).nextLine();
定义正则:不能以0开头,5-10位数字
String regex = "[^0][\\d]{4,9}";
进行匹配
boolean matchResult = strNum.matches(regex);
System.out.println(matchResult);

String[] split(String regex):根据给定的正则表达式来匹配拆分此字符串

            等同于  Pattern.compile(regex).split(str);

    String[] split(String regex,int limit):  同上,只是限定了匹配模式的使用情况

            等同于  Pattern.compile(regex).split(str);

    String replaceAll(String regex, String replacement ):使用给定的replacement替换

            此字符串所有匹配给定正则表达式的子字符串。

代码示例如下:

//      去除重复汉字,要求打印效果为:我是程序员
String str = "我我我我....是是是是是....程程程程程...序。。。员";
//      1.去除非汉字字符
String resultStr = str.replaceAll("[(\\.)|(。)]", "");
//      2.定义重复字符的正则,定义替代元素,注意组的重复和单个字符的区别,注意$的使用
String regex1 = "(.)\\1+";
String replacement1 = "$1";
String finalStr = resultStr.replaceAll(regex1, replacement1);
System.out.println(finalStr);

代码示例:对IP地址进行排序

String ipStr = "23.125.35.12 23.45.56.123 45.65.255.45";
String ipStrRegex = ipStr.replaceAll("(\\d+)", "00$1");
String ip = ipStrRegex.replaceAll("0*(\\d{3})", "$1");
String[] ipArr = ip.split(" ");
TreeSet<String> ts = new TreeSet<String>();
for(String ipEle : ipArr){
ts.add(ipEle);
}
for(String ipEle : ts){
System.out.println(ipEle.replaceAll("0*(\\d+)","$1"));
}


------- android培训java培训、期待与您交流! ----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: