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组。那么问题来了,对于一个复杂的表达式,很容易出现小括号之间的多层嵌套,分组不可能像例子这样一目了然,那么正则表达式分组的标准是什么呢?

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

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