1. 程式人生 > >Java基礎——正則表達式

Java基礎——正則表達式

這就是 get 英語 with res regexp 獲取 意思 find

一、什麽是正則表達式

正則表達式,又稱規則表達式。(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表通常被用來檢索、替換那些符合某個模式(規則)的文本。

許多程序設計語言都支持利用正則表達式進行字符串操作。例如,在Perl中就內建了一個功能強大的正則表達式引擎。正則表達式這個概念最初是由Uinx中的工具軟件(例如sed和grep)普及開的。正則表達式通常縮寫成“regex”,單數有regexp、regex、復數有regexps、regexes、regexen。

* 代表多個  
?代表一個字符(可以有,可以無)

--圖書編號 要麽是5個數字,要麽是5個數字加上 - 4 個數字,比如 12345 或 12345-0001

\d{5}(-\d{4})? 技術分享 -- abc?匹配誰? abc, ab -- a(bc) 匹配誰 abc ,bc //bc是一個子匹配 **子匹配 圓擴號擴起來的表達式部分為一個子匹配(也叫子表達式),除了可以得到整個表達式匹配的結果外,還可以得到子表達式的匹配結果。使用驗證工具,對 a(bc)? 進行驗證,輸入 abc,得到的結果是) //? 規定前面的出現 0 或 1 次 位置 0: abc 位置 1: bc 多個子表達式匹配的原始內容按照它們在正則表達式模式中從左到右出現的順序存儲在緩沖區中,這種過程稱為捕獲,圓擴號中的子匹配所捕獲的內容可以在整個表達式中位於這個擴號之後的地方被引用,第一個圓擴號(即第一個子匹配) 捕獲的內容用 \1 表示,第二個用 \2 ,以此類推 -- 匹配兩個連續相同的數字 88, 99, 33 // (\d)\1 -- 匹配 5 個連續相同的數字字符 66666 // (\d)\1{4} -- 匹配 1221 , 4664 , 7887, 0220 這樣的 // (\d)(\d)\2\1 -- 匹配 1225 , 4668, 5887 這樣的(和上例不同是這個首尾並不相同) // \d(\d)\1\d 二、javascript 中的 RegExp 對象
每個正則表達式模式都對應一個 RegExp、javascript 中,有兩種創建RegExp 實例的方式。 -- 使用 RegExp 對象 new RegExp("pattern"[,"flags"]) -- 使用 RegExp 對象的隱式構造函數 /patern/[flags] var reg=/^\d{8}$/ 註意: flags 標誌字符 -g 用作全局標誌 //對文本中所有的匹配都進行,否則最早的 -i 用作忽略大小寫 -m 用作多行標誌 當使用顯示構造函的方式創建 RegExp實例對象的時候,應將原始的正則表達式模式文本中的每個 \ 都用 \\ 來替換,例如,下面兩條語句是等價的
var r =new
RegExp("\\d{5}"); 如果用要匹配 \ 怎麽辦? 要使用 \\\\ (四個) var r=/\d{5}/;
==RegExp 對象的方法 -- test(str) 是否包含 -- exec(str) 對一個字符串進行搜索,返回一個數組,沒找到返回null -- compile 略 ==String 對象中與正則表達式有關的方法 --match 語法格式為 match(regExp) ,與 RegExp 對象的exec 方法類似,返回一個數組。 註意,傳給它的參數是一個 RegExp 對象,如果設置了全局標誌,它返回的數組內容和 RegExp.exec() 的返回有所不同。返回的數組裏面,是一個個的完整匹配,而不是象前者那樣,第一個是完整匹配,而其他的是一個個的子匹配結果 --search 語法為 search(regExp)返回第一個匹配的字符串的位置 --replace replace(regExp,replaceText) --split(regExp) 三、正則表達式語法 要靈活運行正則表達式,必須了解其中各種元字符的功能,元字符從功能上大致分為: 1.限定符 2.選擇匹配符 3.分組組合和反向引用符 4.特殊字符 5.字符匹配符 6.定位符 == 限定符 1) {n} 規定前面的必須出現n次 // \d{5}, a{5} 2) {n,} 規定前面的至少出現n次 // 註意 "至少" 這兩個字 3) {n,m} 規定出現次數在n 和 m 之間 //註意,不要亂加空格 (n 和 m 都包含) 4) + 規定前面出現的第一個字符或者是擴號擴起來的第一個序列 必須是一次,或多次 // \d+ -> 9 或 4567 zo+ 不匹配z 匹配 zo ,匹配 zoo 等效於 zo{1,} 5) * 前面出現的可以是任意次 zo* 匹配 z, 匹配 zo ,匹配 zoooo 等效於 zo{0,} 6) ? 前面的內容一次或零次 zo? 匹配 z , 匹配 zo , 不匹配 zoo, 等效於 zo{0,1} == 選擇匹配符 | , 二選一,盡量往大取 cat|dog nice ,匹配的是 cat 和 dog nice 附:(cat|dog) nice == 分組組合和反向引用符 分組組合符:將正則表達式中的某一部分內容組合起來的符號,反向引用符:用於匹配前面的分組組合所捕獲到的內容的標識符號 1) (pattern) 註意 要匹配字面意義的 ( ,要使用 \( 2) \num 這就是反向引用,用於匹配 num 所指定的特定緩沖區中的內容 例如 要匹配連續 5個相同的數字字符 要使用 (\d)\1{4} 3){?:pattern} 不會把 pattern 部分當作子匹配,主要用於那種必須過行組合,但又不想讓被組合的部分進行子匹配的情況,省緩沖區 例如 this is (a cat) 寫成 this is (?:a cat) 4) (?=pattern) 正向預測先行匹配 例如: windows (?=NT|2000) ,只於 windows 2000 或 windows NT 中的 windows匹配而不於 windows 2003 中的windows 匹配 ,註意它匹配的結果 只是windows部分。比如常見的應用 :將全文 windows 2000 或 windows NT 前面的 windows改寫成 win,就要用這個方式 replace(/^windows (?=NT|2000)$/,"win"); 註意: windows(?=NT|2000) cat ,在文本 My windows NT cat 中的匹配結果是多少,啥也匹配不著,因為它匹配的是 window cat 5) (?!pattern) 反向預測先行匹配 == 特殊字符 正則表達式中,以反斜框 \ 後緊根其他轉義字符序列來表示原意字符 1 \xn (這裏的n必須是兩位) \x41 匹配字符A \x04 的意義是 \x04 所給表示的字符後面緊根字符 1 2 \n 要求 n 是一個1位的8進制數 3 \nm mn都是一個一位的8過制數 4 \nml n是0-3之間的8進制數 5 \un 匹配unicode碼等於n的字符, 比如 \u00A9 匹配版權號 6 \cx 例如 \cM 匹配 Control+M 表示的控制字符,也就是回車符 7 \f 匹配換頁符 等效於 \x0a 和\cJ 8 \n 匹配回車符 等效於 \x0d 和\cM 9 \t 匹配制表符 等效於 \x09 和 \cl 10 \v 匹配垂直制表等 == 字符匹配符 1) [...] 匹配包含在其中的任意一個字符 例 [ABC] 匹配 A,B,C 中任意一個,註意,如果要包含 [ 要將它放在第一位 ,如果要包含 \ 要寫成 \\ 2) [^...] 和上面的相反,匹配沒有出現的任何字符 例 [^ABC] 只要不是A,或 B,或 C 就行 註意, ^一定要放在前面,否則它就是字面意義上的^ 3) [a-z] 匹配指定泛圍的 例如 [0-9] = \d 4) [^a-z] 匹配不在a-z之間的任意字符 5) \d 任意的數字字符 等效於 [0-9] 6) \D \d 逆運算 等效於 [^0-9] //逆運算都是大寫的 7) \s 匹配任何的空白字符 (space) 8) \S 是\s 的逆運算 9) \w 等效[a-zA-Z0-9_] 任意的大小寫字母,數字,下劃線 //註意它不匹配 - ,但匹配 _ 10) /W 是\w的逆運算 等效於[^a-zA-Z0-9_] 11) . 匹配除了 \n之外的任意字符,要匹配本身,用\.
var setr="高睿說: 我我..下棋....很.很....厲害";
//第一次,去掉所有的.
str=str.replace(/\./g,"");
//第二次,去掉重復的字
str=str.replace(/(.)\1/g,  "$1");
//結果 : 高睿說: 我下棋很厲害

== 定位符

1) ^ 規定匹配必須發生在目標字符串的開頭部分上,必須出現在最前面才有用

例如 ^o 與 ok中的 o 匹配,但於 dog 中的 o 不匹配,,如果設置了RegExp對象實例的

MultiLine 屬性, ^ 還會與首行匹配, 即與 \n 或 \r 之後的位置匹配

2) $ 匹配目標字符串的結尾位置,必須出現在最後才有定位符的作用

例如 o$ 與 hello 中的 o 匹配 ,但與 ok 中的 o不匹配

3) \b 匹配一個字(也就是一個單詞) 的邊界,它包含了字與空格間的位置以及目標字符串的開始和結束等位置

例如 "er\b" 匹配 never ok 中的er ,但不匹配 verx 中的er

"\bis\b" 匹配 this is anicecat isisisdog 中的 is

4) \B \b的逆運算 ,結果與上例相反

//例子

調用 replace(/win/g,"close") 來替換 win a window ,得到 close a closedow

調用 repalce(/\bwin\b,"close"/) 得到 close a window

//例子

如果想在一段文本的內容中的每行前面都加上同一個標記文本,只需使用這個標記文本對

^ 做全局替換即可

var str= "aaa\nbbb\nccc";

alert( str.replace(/^/mg,"#")); 這裏的m 指的是多行的意思

結果:
#aaa 
#bbb
#ccc
== 附

---- 原義字符

一些元字符不在再表示它原來的字面意義,如果要匹配它們的字面意義,必須使用

\ 轉義

需要進行轉義的字符 $ ( * . [ ? \ / ^ { |

---- 優先級順序

* 比字符優先級高,比如 ab* 是 b 和 * 組合後,再和前面的 a組合

()比 *優先級高,(ab)* 是a和b組合後,再和* 組合,字符比 | 優先級高,

a|bc 是 bc組合後,再和 a 組合

一些正則表達式模式範例

匹配空行 /^\s*$/

匹配HTML標記 /<(\S+)(\s[^>]*)?>[\s\S]*<\/\1\s*>/

匹配email /^[a-zA-Z0-9_-][email protected][a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/

匹配兩個相同相鄰的單詞 /\b([a-z]+)\1\b/ //例如 CatCat

匹配 ip 地址 /^\d{1,2}|1\d\d|2[0-4]\d|25[0-5](\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/

\u4e00-\u9fa5 表示中文

四、java 中使用正則表達式驗證

             //例一 驗證手號碼
            public static boolean checkPhone(String str){
                boolean result=true;
                
                if(str.length()!=11){
                    result=false;
                    System.out.println("號碼長度不正確");
                }
                if(!str.startsWith("1")){
                    result=false;
                    System.out.println("不是以1開頭的");
                }
                
                char [] arr=str.toCharArray();
                for(int i=0;i<arr.length;i++){
                    if(!(arr[i]>=‘0‘&&arr[i]<=‘9‘)){
                        result=false;
                        System.out.println("含有非法字符");
                        break;
                    }
                }
                return result;
            }    
            
         //例二
            public static boolean checkPhone2(String str){
                boolean result=true;
                try{
                    Long.parseLong(str);
                }
                catch(Exception ex){
                    System.out.println("手機號格式不正確");
                    result=false;
                }
                return result;
            }
        // 例三
        public static boolean checkPhone3(String str){
                String regex="1[3584]\\d{9}";
                return str.matches(regex);
        }
     //例四 使用正則表達式進行切割
        public static void splitDemo1(){
            String str="aaa---bbb-------ccc----ddd";
            String [] strList=str.split("-+");
            System.out.println(strList.length);
            for(String s:strList){
                System.out.println(s);
            }
        }
     //例五
     public static void splitDemo2(){
        String str="aaa.bbb.ccc.ddd";
        String [] strList=str.split("\\.");
        System.out.println(strList.length);
        for(String s:strList){
            System.out.println(s);
        }
    }
   //例六
    public static void splitDemo3(){
        String str="c:\\windows\\system32\\aa.bmp";
        String [] strList=str.split("\\\\");
        System.out.println(strList.length);
        for(String s:strList){
            System.out.println(s);
        }
    }
   //例七 替換
    public static void replaceDemo(){
        String str="要1234想辦456假證,請聯系13503688749或13302564798 或者是 15050020120 或者 257";
        String regex="\\d{11}";
        System.out.println(str.replaceAll(regex, "混球"));
    }
  //例八 獲取
    public static void getDemo(){
        String str="林花謝了春紅大蔥蔥,太匆匆,好大大蔥大蔥蔥大蔥蔥蔥";
        String regex="大蔥蔥+";
        
        Pattern pattern=Pattern.compile(regex);
        Matcher matcher=pattern.matcher(str);
        
        while(matcher.find()){
            System.out.println(matcher.group());
        }
    }
  //例九 從網頁上獲取
  public static void webGetDemo()throws Exception {
        URL url=new URL("http://localhost:8080/book-shop/login.jsp");
        URLConnection conn=url.openConnection();
        
        BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream()));
        
        String regex="[a-zA-Z0-9_-][email protected][a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+";
        Pattern pattern =Pattern.compile(regex);
        
        String str=null;
        while((str=br.readLine())!=null){
            Matcher matcher=pattern.matcher(str);
            while(matcher.find()){
                System.out.println(matcher.group());
            }
        }
    }   

Java基礎——正則表達式