正則表達式

      其實正則表達式沒有其實挺簡單的,首先給出兩個列東西,能夠大體看一下,稍後詳解。

在方括號[]外面
字符 含義
\ 轉意字符
^ 在字符串開始處匹配
$ 在字符串結尾處匹配
() 子模式
. 匹配除回車外的全部字符
* 重複0次或者更多
+ 重複1次或者更多
{} {min,max}最小,最大
? 標記一個子模式爲可選
在方括號裏面
字符 含義
\ 轉意字符
^ 非,僅用在開始處
- 指明字符範圍

        開始經過實例解釋下:

        第一個例子:郵箱格式php

           在開發中,經常要用到判斷一個郵箱地址是否正確,那麼必須先寫出郵箱的正則表達式才行。通常郵箱是(數字,字母,點,下劃線,中劃線)@(數字,字母,中劃線(注意,第一個不能爲中劃線)這個結論可能有錯,但不影響下面的分析).(字母)linux

          那麼它的正則表達式就能夠寫成:^[a-zA-Z0-9_\.\-]+@([a-zA-Z0-9][a-zA-Z0-9\-]*\.)+[a-zA-Z0-9]+$正則表達式

          ^ $做用能夠理解爲,將證字符串拿過來比較,從開頭比較到結尾。windows

          [a-zA-Z0-9_\.\-]中 a-z表示從a到z的全部字母,同理,A-Z 0-9做用同樣,再加下劃線,中劃線,點:_123dfaf_.,dfaouf_24234-都符合。工具

注意了,若是你只寫了上面這個表達式,表明什麼?就是隻匹配一個字母,因此要寫[a-zA-Z0-9_\.\-]+這樣才能匹配多個,+是重複一次或者屢次,至少一次。編碼

直接到後面([a-zA-Z0-9][a-zA-Z0-9\-]*\.)表示上面,因爲第一個不能爲中劃線,因此[a-zA-Z0-9]如此寫,有由於已經匹配過一個字母或數字了,理論上能夠了,因此用[a-zA-Z0-9\-]*重複0次或屢次。spa

        另外一個例子:日期.net

         ([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})3d

      主要想講一下{1,2}做用([0-9]{1,2})表示,期間的字符串最少能夠1位,最大可使用2位。code

      我想問已經講的差很少了,可是應該有不少不足,若是想了解更多,能夠留言,通常晚上會解答。或者QQ:356342556 2012-05-24至2012-09-01基本在線,以後因爲要複習,因此白天基本不在線。

     你們一塊兒交流。

      下面的網址是2012-07-23才找到了,由於個人文章還有不詳細之處,下面的這網址介紹的很全面,強烈推薦

         http://deerchao.net/tutorials/regex/regex.htm

         

         一下內容更新與2012-08-01:關於正則表達式中 /i /is /isU的解釋

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

經常使用集合:

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

     1)a-zA-Z_0-9    //常見字符;
    2)(abc)(skd)    //單元符合,括號內的元素會看作是一個內容;
    3)[abcd][^abd]  //原子表,^表示排除或者相反的內容;^:ctrl符;
    4)轉義字符:
       \d:    [0-9];
       \D:    [^0-9];
       \w:    [a-zA-Z_0-9];常見字符匹配;
       \W:    [^a-zA-Z_0-9];很是見字符;
       \s:    空格、回車、製表符;

 

*  匹配前一個內容0次,一次或者屢次;
  .  匹配內容的0次1次或屢次,除了回車、換行之外的任意字符;(.*):任何字符;
  +  匹配前一個內容1次或者屢次;
  ? 匹配前一個內容的0次或者1次;
  |  選擇匹配;(前面和後面內容當成總體操做)
  ^  匹配字符串首部內容;
  $  匹配字符串尾部內容;
  \b 匹配單詞邊界,邊界能夠是空格或者特殊符號;
  \B 匹配除帶單詞邊界之外的內容;
  {m}匹配前面內容重複M次;
  {m,}匹配前面內容重複次數大於m次;
  {m,n}匹配前面內容重複次數在於m、n之間;
  ()合併總體匹配,放入內存,可以使用\1\2依次獲取;
  $mode='/go*gle/';*前面的o是當作匹配的做用符處理的,而不做爲數據的顯示;
  $mode='/\bis\b/';is先後都有分隔符;
  $mode='/p{5,}/';匹配5次以上;

\b 匹配一個單詞邊界,也就是指單詞和空格間的位置。例如,「er\b」能夠匹配「never」中的「er」,但不能匹配「verb」中的「er」。  
\B 匹配非單詞邊界。「er\B」能匹配「verb」中的「er」,但不能匹配「never」中的「er」。  
\cx 匹配由x指明的控制字符。例如,\cM匹配一個Control-M或回車符。x的值必須爲A-Z或a-z之一。不然,將c視爲一個原義的「c」字符。  
\d 匹配一個數字字符。等價於[0-9]。  
\D 匹配一個非數字字符。等價於[^0-9]。  
\f 匹配一個換頁符。等價於\x0c和\cL。  
\n 匹配一個換行符。等價於\x0a和\cJ。  
\r 匹配一個回車符。等價於\x0d和\cM。  
\s 匹配任何空白字符,包括空格、製表符、換頁符等等。等價於[\f\n\r\t\v]。  
\S 匹配任何非空白字符。等價於[^\f\n\r\t\v]。  
\t 匹配一個製表符。等價於\x09和\cI。  
\v 匹配一個垂直製表符。等價於\x0b和\cK。  
\w 匹配包括下劃線的任何單詞字符。等價於「[A-Za-z0-9_]」。  
\W 匹配任何非單詞字符。等價於「[^A-Za-z0-9_]」。  
\xn 匹配n,其中n爲十六進制轉義值。十六進制轉義值必須爲肯定的兩個數字長。例如,「\x41」匹配「A」。「\x041」則等價於「\x04」&「1」。正則表達式中可使用ASCII編碼。. 
\num 匹配num,其中num是一個正整數。對所獲取的匹配的引用。例如,「(.)\1」匹配兩個連續的相同字符。  
\n 標識一個八進制轉義值或一個向後引用。若是\n以前至少n個獲取的子表達式,則n爲向後引用。不然,若是n爲八進制數字(0-7),則n爲一個八進制轉義值。  
\nm 標識一個八進制轉義值或一個向後引用。若是\nm以前至少有nm個得到子表達式,則nm爲向後引用。若是\nm以前至少有n個獲取,則n爲一個後跟文字m的向後引用。若是前面的條件都不知足,若n和m均爲八進制數字(0-7),則\nm將匹配八進制轉義值nm。 
\nml 若是n爲八進制數字(0-3),且m和l均爲八進制數字(0-7),則匹配八進制轉義值nml。  
\un 匹配n,其中n是一個用四個十六進制數字表示的Unicode字符。例如,\u00A9匹配版權符號(?)。 

 

i 匹配大小寫

s 模式中的圓點元字符(.)匹配全部的字符,包括換行符

x 模式中的空白字符除了被轉義的或在字符類中的之外徹底被忽略,在未轉義的字符類以外的 # 以及下一個換行符之間的全部字符,包括兩 頭,也都被忽略

A (PCRE_ANCHORED) 若是設定了此修正符,模式被強制爲「anchored」,即強制僅從目標字符串的開頭開始匹配即自動在模式開頭加上^。

D (PCRE_DOLLAR_ENDONLY) 若是設定了此修正符,模式中的美圓元字符僅匹配目標字符串的結尾。沒有此選項時,若是最後一個字符是換行符的話,美圓符號也會匹配此字符以前(但不會匹配任何其它換行符以前)。若是設定了 m 修正符則忽略此選項。Perl 中沒有與其等價的修正符。 S 當一個模式將被使用若干次時,爲加速匹配起見值得先對其進行分析。若是設定了此修正符則會進行額外的分析。目前,分析一個模式僅對沒有單一固定起始字符的 non-anchored 模式有用。  

U (PCRE_UNGREEDY) 本修正符反轉了匹配數量的值使其不是默認的重複,而變成在後面跟上「?」才變得重複。這和 Perl 不兼容。也能夠經過在模式之中設定 (?U) 修正符來啓用此選項。

X (PCRE_EXTRA) 此 修正符啓用了一個 PCRE 中與 Perl 不兼容的額外功能。模式中的任何反斜線後面跟上一個沒有特殊意義的字母致使一個錯誤,從而保留此組合以備將 來擴充。默認狀況下,和 Perl 同樣,一個反斜線後面跟一個沒有特殊意義的字母被當成該字母自己。當前沒有其它特性受此修正符控制。即:貪婪模式,最 大限度匹配 如:/a[\w]+?e/U匹配abceadeddd中的abceade而不是abce,若是不加U修正,則匹配abce u (PCRE_UTF8) 此修正符啓用了一個 PCRE 中與 Perl 不兼容的額外功能。模式字符串被當成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

應用:

 

[php]  view plain copy
 
  1. define("AAPTTOOL","c:/apktool/aapt");//aapt工具的路徑  
  2. define("UNZIP","E:/GnuWin32/bin/unzip.exe");//試了試winrar等,沒成功,就用了unzip,而linux有自帶這個的  
  3.           
  4. function getApkIcon($apk_file,$save_path){  
  5.           
  6.     $aapt = AAPTTOOL;   //aapt工具的路徑  
  7.     exec("{$aapt} d badging {$apk_file}",$out,$return);//從apk中解除信息  
  8.           
  9.     if($return == 0){  
  10.         $str_out = implode("\n"$out);//分離信息  
  11.     }  
  12.       
  13.     $pattern_icon = "/icon='(.+)'/isU"//提取icon信息  
  14.     preg_match($pattern_icon$str_out,$m);  
  15.     $info['icon']= $m[1];  
  16.       
  17.     if($info['icon']){  
  18.         $command = UNZIP." -o -j {$apk_file} {$info['icon']} -d $save_path";  
  19.         exec($command);//解壓  
  20.     }  
  21. }  
  22.    
  23.     getApkIcon("//192.168.1.156/temp/test.apk","c:/tmp/");  


注意:windows裏面的換行是 回車+換行;

 

因此用

 

[php]  view plain copy
 
  1. $str_out = implode("\n"$out);//分離信息  

分離所得的信息。

 

 

[php]  view plain copy
 
  1. $pattern_icon = "/icon='(.+)'/isU"//提取icon信息  

中‘i’是不區分大小寫;s 模式中的圓點元字符(.)匹配全部的字符,包括換行符。

 

 

[php]  view plain copy
 
  1. /name='(.+)'/is  

將會正則出,全部重複替換成全部的文字。也就是說替換出icon='ffjaljfljda'fafaf 'lfjljaljfl'全部的字符

 

但這不是咱們想要的,咱們只要icon='fdafalfj',因此用U就是說就結束了,也就是實現最短的匹配,匹配完了就結束了。

 

[php]  view plain copy
 
  1. preg_match($pattern_icon$str_out,$m);  
  2.     $info['icon']= $m[1];  

中的

[php]  view plain copy
 
  1. $info['icon']= $m[1];  

是由於$m[0]放的是整個匹配的字符,$m[1]中放的是第一個正則表達式中第一個括號內的匹配內容,以此類推。

 

本次只有一個括號,因此只有$m[0]和$m[2]。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息