正则表达式 Pattern

java正则表达式 pattern基本语法

import java.util.regex.*;

 1 import java.util.regex.*;
 2 
 3 Pattern p = Pattern.compile("[a-z]{3}"); //编译后要匹配的模式
 4 Matcher m =p.matcher("abc");
 5 soup(m.matches());// matches匹配整个字符串
 6 soup("abc".matches("[a-z]{3}");//该种方式没有编译,处理时会较慢
 7 
 8 ?0->1个字符   . 1个字符  * 0->多个字符   + 1->多个字符
 9 soup("".matches("a?") && "".matches("a*")); //true,0宽度匹配.
10 "^[abc]"=>以abc其中之一开头   (开头)
11 "[^abc]"=>取除了abc三个字符之外的字符  (取反)
12  \\w   等于   "[a-zA-Z_0-9]"      
13  \\d 等于[0-9]      \D 等于 [^0-9]
14     "\\".matches("\\\\"); //true
15    \\代表一个\       前面两个\\成为一个\  , 后面两个\\也成为一个\,然后因为在字符串中\\两个再转义成\
16 \\s 等于[\t\n\r\f]
17 soup("     \n".matches("^[\\s&&[^\\n]]*\\n$"); {开头是除\n外的空格字符 结尾是\n} $表示结尾 ,用来检测该行是不是空白行
18 \\b 单词边界 如abc def-ghi   (cd之间 fg之间就是\b)
19 soup("Hello sir".matches("^H[a-z]o\\b.*")//true
20 soup("Hellosir".matches("^H[a-z]o\\b.*")//false

 我的正则使用日记

import java.util.regex.*;
public class Pattern_Test {
    public static void main(String[] args) {
        pattern1();
        pattern2();
        pattern3();        
        pattern4();    
        }    
    public static void pattern1(){
        Pattern p  = Pattern.compile("\\d{3,5}");
        Matcher m = p.matcher("012A45678B9");
        System.out.println(m.matches());
        m.reset();
        while(m.find()){
            System.out.println(""+m.start() +"->"+ (m.end()-1));
        }
    }    
    public static void pattern2(){
        Pattern p = Pattern.compile("java",Pattern.CASE_INSENSITIVE);
        String str ="jaVa_JaVa_JAVa_jAVA_abc";
        Matcher m = p.matcher(str);
        StringBuffer sb = new StringBuffer();
        int number = 0;
        while(m.find()){
            number ++;
            if(number % 2 == 0){ //偶号全改成java
                m.appendReplacement(sb,"java");
            }else{ //奇号全改成JAVA
                m.appendReplacement(sb,"JAVA");
            }// 将该次匹配的替换成指定字符串"JAVA"后,
            // 再将上一次匹配的m.end()到这一次匹配的m.end()-1的这一段字符添加到sb中
        }
        m.appendTail(sb); //将最后一次匹配的m.end()到末尾全添加到sb中
        System.out.println(sb);
//        m.reset();
//        System.out.println( m.replaceAll("JAVA") );//全替换成 JAVA
    }    
    public static void pattern3(){
        Pattern p = Pattern.compile( "(\\d{3,5})([a-z]{2})" );
        Matcher m =p.matcher("123aa-34567bb-189cc-00");
        while(m.find()){
            System.out.println(m.group(0));
        }
        m.reset(); System.out.println("_____________________");
        while(m.find()){
            System.out.println(m.group(1));
        }
        m.reset(); System.out.println("_____________________");
        while(m.find()){
            System.out.println(m.group(2));
        }
    }
    public static void pattern4(){
        Pattern p1 = Pattern.compile(".{3,10}[0-9]");//Greedy
//默认贪婪的:  先直接取10个,aaaa5bbbb7| 不匹配,吐一个aaaa5bbbb|7匹配了,于是0 start->10 end
        Pattern p2 = Pattern.compile(".{3,10}?[0-9]");//Reluctant
//不情愿,勉强的:  先取aaa 3个,不匹配,吃一个aaaa 4个还不匹配,再吃一个aaaa5        
        Pattern p3 = Pattern.compile(".{3,10}+[0-9]");//Possessive
//独占的:  直接全取aaaa5bbbb6不吐出来,故not match
//                    0123456789  
        String s = "aaaa5bbbb7";
        Matcher m = p2.matcher(s);
        if(m.find()){
            System.out.println(m.start()+"--->"+m.end());
        }
    }
}

 

 

正则表达式(从oracle提取时的)奇葩问题 :

假如我们要把正则表达式放到oracle数据库里,想用的时候再提取出来,那么问题来了....

前题:你已经把标准的java正则表达式放在oracle中如下(非打印语句,而是调试时内容)

requestHead\"\\s*:.*userId\"\\s*:\\s*\"(.+?)\" 

然而当我们用java程序从oracle中select提取出来的时候,却变成如下:(非打印语句,而是调试时内容)

requestHead\\"\\\\s*:.*userId\\"\\\\s*:\\\\s*\\"(.+?)\\"  

应该是被转义了.

所以我们为了能正确使用,我们需要做如下替换:

format = format.replace("\\\\", "\\");

以上语句中第一个参数"\\\\"是pattern表达式,所以\\代表\, 于是\\\\代表\\ ,

而上语句中第二个参数"\\"是普通String,所以\\代表\,

最终上条语句的意思是,把真实内容中的\\都替换成\  

在理解以上情景时请以调试时的红框中内容为标准,而非System.out.println()时打印出来的内容为标准

正则表达式 Pattern_第1张图片

 

你可能感兴趣的:(正则表达式 Pattern)