正则表达式

      其实正则表达式没有其实挺简单的,首先给出两个列东西,能够大体看一下,稍后详解。

在方括号[]外面
字符 含义
\ 转意字符
^ 在字符串开始处匹配
$ 在字符串结尾处匹配
() 子模式
. 匹配除回车外的全部字符
* 重复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]。

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

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息