• 正则表达式(二)


    1.正则表达式处理字符串

    案例一(字符查找和替换):

      找出一个字符串中所有的“java”,并将一个字符串中的奇数位置的“java”(不区分大小写)换成“java”,偶数位置的“java”(不分大小写)换成“JAVA”。

     1 import java.util.regex.Matcher;
     2 import java.util.regex.Pattern;
     3 
     4 
     5 public class RegexTStr {
     6 
     7     public static void main(String[] args) {
     8         
     9         Pattern p=Pattern.compile("java",Pattern.CASE_INSENSITIVE);
    10         Matcher m=p.matcher("java,Java ,JAva, JAVA heheJAVa,hellojavATOO");
    11         
    12         System.out.println("找出所有java");
    13         while(m.find()){
    14             System.out.println(m.group());  //表达式 m.group()s.substring(m.start(), m.end()) 是等效的。
    15         }
    16         
    17         
    18         System.out.println();
    19         //奇数换java,偶数换JAVA
    20         m.reset();
    21         StringBuffer sb=new StringBuffer();
    22         int i=0;
    23         while(m.find()){
    24             i++;
    25             if(i%2==1){
    26                 m.appendReplacement(sb, "java");
    27             }else{
    28                 m.appendReplacement(sb, "JAVA");
    29             }
    30         }
    31         
    32         m.appendTail(sb);
    33         System.out.println(sb);
    34     }
    35 
    36 }

    输出结果:

    找出所有java
    java
    Java
    JAva
    JAVA
    JAVa
    javA

    java,JAVA ,java, JAVA hehejava,helloJAVATOO

    注意:matcher中表达式 m.group()s.substring(m.start(), m.end()) 是等效的。

    案例二(正则表达式分组):

      在正则表达式中,可以用小括号"()"来对正则表达式中的内容进行分组,并用m.group()按组取出。直接看下面例子:

     1 import java.util.regex.Matcher;
     2 import java.util.regex.Pattern;
     3 
     4 
     5 public class RegexTStr2 {
     6 
     7     public static void main(String[] args) {
     8         Pattern p=Pattern.compile("\d{3,5}[a-z]{2}");
     9         Matcher m=p.matcher("123aa-12345bb-123456ccc-1234ddd-00");
    10         while(m.find()){
    11             System.out.println(m.group());
    12         }
    13     }
    14 
    15 }

     输出结果:

    123aa
    12345bb
    23456cc
    1234dd
      上面的代码,我们从一个字符串中取出了满足正则表达式的子串,那么如果我们现在要求只取出满足要求的子串中的数字部分或字母部分要如何做呢?相信很多人看到这里立刻会想到在循环中再写正则表达式对子串进行处理,那么还有没有其他方法呢?请看下面:

     1 import java.util.regex.Matcher;
     2 import java.util.regex.Pattern;
     3 
     4 
     5 public class RegexTStr2 {
     6 
     7     public static void main(String[] args) {
     8         Pattern p=Pattern.compile("(\d{3,5})([a-z]{2})");//将正则表达式分成2组
     9         Matcher m=p.matcher("123aa-12345bb-123456ccc-1234ddd-00");
    10         while(m.find()){
    11             System.out.println(m.group(1)+"----------"+m.group(2));            
    12         }
    13     }
    14 
    15 }

    输出结果:

    123----------aa
    12345----------bb
    23456----------cc
    1234----------dd

      这样是不是比其他方法更简单呢?上面的m.group(n)中的参数n代表第n组。那么问题来了,对于一个复杂的表达式,很容易出现小括号之间的多层嵌套,分组不可能像例子这样一目了然,那么正则表达式分组的标准是什么呢?

      答案:对于一个复杂的表达式,我们按照左括号"("出现的顺序来确定分组。第一个左括号包含的内容就代表第一组,第二个代表第二组,以此类推。

      所以,如果要处理的字符串的处理过程很复杂,我们可以用分组的正则去处理

  • 相关阅读:
    Vs2013在Linux开发中的应用(19): 启动gdb
    Codeforces Round #277 (Div. 2)---C. Palindrome Transformation (贪心)
    DataGridView依据下拉列表显示数据
    android POI搜索,附近搜索,周边搜索定位介绍
    HDU OJ Max sum 题目1003
    Android时时监測手机的旋转角度 依据旋转角度确定在什么角度载入竖屏布局 在什么时候载入横屏布局
    Hadoop架构设计、执行原理具体解释
    关联引用
    Linux性能诊断工具
    HDU 5089 Assignment(rmq+二分 或 单调队列)
  • 原文地址:https://www.cnblogs.com/andong2015/p/4256766.html
Copyright © 2020-2023  润新知