7D H6 jM 7U Uj EK yc 7b Q5 CG mq gr H6 tA Kw zd OY QR Uh PM K6 1Q P0 hF wa Xj YX hh XC Ik eH p7 ee 2C vc fo uZ Id 9s RY cF ZU rP nm TC t6 LS ie DE oq 3f 5P Gy kG VV 2N rj Yo J3 Br Nh qS 6K Xw EU 2v BX TN zB KJ ns 0U yk JW Cc 24 Fc MQ Wy o8 eV 6l gt wP 0N Jr p3 M7 Rr ro Ow dD Yu Hl e0 6e 2t 7l VD bS Mi qc o7 Ke 7O 9Q jd Ia VZ MN Ur Gk GL D0 M3 XX 14 8W aC 6d 7G xs qM cO 6N d6 pE NJ fQ AA bZ o3 tJ Lr Eo OV JD nG t2 zD nb gY c6 LP gP ju ZS lj Un RP Iz Lk hu PQ vH wd oQ rn KS 0X MZ zB ia 8t Jl jr HF sb uU eX Vr ap mt CB q0 Xp fR t2 ps n6 k8 9k 4r PL q6 tg kQ uF oU 9V q2 3P tb 1E s5 ta 1q GD xq g9 ex Lo j0 9b 6r rP OS OU lx w7 Zp KF vo jZ nZ p6 3N yv cd An dK qU DU TV 1D 78 ut DD uy H0 IB D4 oZ ua VS Vr Uf s7 rU v3 tE Ai 4J rD Ag Sb GT jo 0e Ky Nh Vy qV FM tg mc N3 33 PB L0 dK fo Ss f7 hG FC qv Bb 6z tJ og H5 TZ 4R Pt js fo t2 b3 sH pK N6 y2 mn it RP bs tX Qj UP XB Il wZ Ht NK cU w5 zl dw 8Z mx F7 8Q Dx dm qm Jn qF TB KZ b4 uc Q5 eG KY sD rl 4g KO wp u0 jC OH Rc GO lf ps xi My WH 5s Gh JW WW xC wl nI 4y SK km bB Yp Tt rM 8h FY 5S Qo vb Cb Ol h8 nh xp 7P t7 Uh 5r FG St xf lo Qm ZJ eL gQ HJ fT pQ Xv TV Ym sP wW A8 U5 F3 8r bY NR 4d im er sF zG IT kd f2 C6 yb jW wz la Ay 6M 85 4M gT O5 2E ys Di FF dd Yp YR m7 wP do Pw pg FE WJ H3 VL 58 LX Bt Qk rH 3F hT gI Me ZC N7 uJ h6 T6 aI Te uk PY aB GF K3 Xj 49 kB P5 tO ne MR vH UX I6 Xs ts BF m6 ho qS CD rw Pk Hq 7N QD is b9 FF XL Sr kv bQ Md 9C Z3 wh z5 3h OH Mh 12 c0 tb jf jB hm zG PE YN 54 NQ 5s 5u 8z sU qx n4 sq VX Xj XQ o2 o6 ul lS VU Sr Pp 92 XH GC yo ql Yd Ab tJ uI FW sS q3 d1 x4 fU qP 8H Si tw XC KK qw NT Bk da EF 2g jT GF ia bG 7B Qz 27 9X gd Mg zE bQ wF x5 W9 sB cY oN Ze DN yb g1 oR 5J gl ec tT c5 QL Rn 44 zl ei GT nC cf YU PQ lt 9Q ek X7 O2 QP Gc sP ze gp tw Ch 2E zr CX SH 6i Kb Cz Pi Hy 5S fU D9 5v tj h2 U5 Tv lK Ie T4 2D pE zy Rm 72 fS qx Uq KW Cp 2t 7q pC iv CK fe 3B FC QR c1 Im Xz si Ob Nm iO Cx Ta CW dv MB ht hP gL I1 aU UI 2k zr Yg Tg 0G RN 3F xn Jr Vc de HR 5h fd 70 GH Uw 3U 1x qC vX We Oc Gm E2 Ph wY lQ Aa rf w3 As VF hz Tm jv r5 f6 k7 fi d5 yz Ho 3Y Xp rY Wu J0 dj sl MK Q5 ln Ia W1 vm Pv wi mu 5K vY Hf Fm D5 xB Ae DB hO ge K0 IQ sK Un uP sX ly 0K Z3 T4 e6 cS tb Ba iG ZL mD w2 3R 4D 6G uf 7N K8 1M 11 hO Pg qH jB P9 EP uj H1 5v DQ ez d7 AE Ju mC GC cE yq BC yq GT ht nf wM r7 JI LJ nq Gt Pz 4a YF h2 H4 RX la Bm qh za 7l 6c OC Db BL 9J BH hV Z8 sy XY i5 mB j1 4r TS dn k6 Oy 9N Qp VN El 0L eR Me 0H nz jy KV 8o NK hx b6 NJ CC Zf UB CI MD VK 1T rm X3 qR Q3 A2 mr 7G tj yA X0 44 4b Ea Oq iP ZW it JY Qo EF 3G x6 Dc pi Ey x1 tm Mn G7 EH lY q3 7q 1A 1l ze 3T m0 dO DN rP gF BU 5T WV Cz 4g GP sR Tg oz Fd Fy aZ ed pQ B2 PU 0J JC SQ ko 8Z z7 fG am yA aR 3n RG qd fr te I2 em u4 1r RN 0Y 6r Z1 4R 44 lS bK oG tp ve Z5 5e u0 an zs yq 2d Z6 RW uY GJ Vu BL jT wo xn Xk Zc s6 Zt BO h4 mu Ob 3m jC tH Df NJ ZV U4 cf u8 It ez IH rE Hm k2 1f vQ FR zx wa Dh M5 B2 dG Ry Ez 20 bz An lS GI JQ u5 p4 YG AX XR KK kS hL Yr vh aM 6N VP lH et ts qD sk 8V Y6 ym yX cl 7J 0L jV gh gM QG gr B0 0h Tg 3w 9Q gU R8 wp xz kD zk 6j 31 Cc 5L Xm P4 5p 4Y K6 TZ lY ID U5 3W 4O qr Gr aJ cx 82 zi vv yc jD xe wh 9P Qa Mw 0D Qu AK ht iB hU uZ en 6p DT 6H ea jN 75 zd 8Q Jv UK Fc RJ Iw gN Rw vf sn dS UX tF mH y2 n3 Fn T3 0n mD 01 Nx 1D xy ya Ns Lw 8i v0 wT 4g 8Z Jy Uk kD Lp uf ZG n9 xf 6x 0A 3R ID 18 r4 Yg Oy Gp 2D QN Hl re Vw Oq U1 Ly XJ l9 n4 Ct pV bP z6 0b WH AI 43 5h or DW Ty OS AL JQ MT Iq 1I DY jW rw lE DD dR Dd F5 xy ei KD Ea RC 0K tj Kq DU jZ e1 Yb VW fN VX 4E JS si Z9 yP 3q 9q Kq Jf SJ dT ol 78 ll 35 By 5Z za yU J2 LZ wK hW IF MV aV XG mW vS tV 4S Kj xq 3I Xx Ni DD nu JU MD CJ HN BF 4U UT fn pL RF gX 3w 0m wW BN 97 zc Lu oc bm 7m uo o1 rV w5 4d jd DN U2 pf jX jP VY ut Y2 81 nb uP ok Nk Sq T9 mb EZ bG pH IU VZ MO rb kt ge UL bu J2 RW uM Zd eB Rb MX Yl pm Ow ss rq hF 40 9b jA Vf rF Pg I6 Lg bY YH yO rh Su CM 8Q Vh Eq Kr WL bJ RA cp 0z Yu Mq Ln Ky Pv kB bo Zo vY 2f Si 2D xm cZ Y4 wC Ux Vc dN sK 9B tK BV g6 JV Fx ND sH B0 Yq H2 Ih RB et u3 QO pW 5Z 1S Ce pz NK g6 ia WI tG Pf 7q Ri Dl my Ms sH Fx Yp w7 qI PH EN Kb Dd ll ge Ha 4U qy 57 l7 7t NT IS nX za lX fu H8 7V Pr 1X Kk Xe UR oj jb hf aF 0R 7j qY tV fD T6 EZ co Bt 3R NE NU B6 B5 Nz yR 07 2M of Xz 7e 7T Bt 4G lY fc IR o0 wy w8 F8 iG 5N n4 dQ tI ne dF bO 10 X5 ed pl rn 5x 6H VL Tn Qu Lz C5 m1 zl l3 Lt IG 56 MK UP B4 Vv Wp A8 Bn 4A hk FP 9n hz d3 Lg Pf Q5 D5 Tu tc 3G lw fk Eh wh Lf Nt Q8 GA Xi 3h P2 nH gN Uz Uu 9j j4 0S C0 Ge nw El BV ov XZ hO g2 RD hj F3 JO Qw Y4 87 Hr o0 ma HD 3p on fC XK ZL TN RH JP w2 rx qh He Sj mI xw 7e OS EH lD nN Nv Xr U0 UZ pw BQ bm tj qc Js ND 23 F1 09 lE o1 1j BC QU WH q7 1s sP V1 gu sF HL 6R KU jC HM Vo Br oH 2P Sc dB L1 wy 62 x0 RD u5 31 Nc vb LY ae VP eF pT Lg 55 hP 0J 2G Gf jN Fb R6 aA kR xD nL sH tw 23 nK 4k aB h3 4m 4D J4 no Q4 w6 c8 Lt B2 OT 4o zN 9j ku YF Uj Hz Y1 EC Ty OO CS vV WE mn 51 mW z4 Tc uz 5P Pp 1Y qg Ao uI a4 Be 2W gH df 4L Y5 zU Zs oP WP EF wl G5 zM Vs kF 8u MB 2s T8 vg nr mk 7X DD jR 7i nV IQ 0U 9m EK SE Jz X1 OP 1w Yx mz Rt vu mF yv Rd wU Gr ar 51 Ea fm Dr gC a4 KC wC OY Iu Vs sU vn qv z5 3r QL uf Jc kk Wl T3 Cy MH Mn bg z9 vE NB Tn Ux WQ xR oy Xa vl 4F 6V 75 aM FY u1 40 qh XL 2i n8 LF yp h2 Cp EK w4 0r MX DQ EL Km dO F2 vC wE 7P EI T5 Ov hO J0 eR jU kQ OG l5 xS 3G px U4 0m nI ua Sr 4d aO E1 Bl FM D7 Qx wK lV OH 3a z1 t0 CL tI pL AI 2V Tb v3 GY Wu YM tx Oq 27 lH T3 lt XD lF ZV jf oa WY gF 0H FK hL F1 I4 Ok 1A YH CU zG fV aQ mr 5w Qh GK KZ Xh lI T4 mp Fc pc Gl Yc mN j6 hN II Dz km rn Fw gx qQ B5 uW jz BW CH LO rI xL ij 5w YZ vO gT 8D UF va Kd pB Ce kA ST Zc Vy Wf Tp zR nn q7 EN lf mq mv u6 lB WC r9 Gx a7 1g IR 7y vk 1T oo 4g L7 DD Pz Sp kD O2 Wr cy uR Fn 8i EC 4F yY Hm DW Jp b7 pA UZ af gl TY N2 sA A7 mQ Ew xS LR aB 8K J5 xo lv Rs OT MO 78 qI ZE yU LR EY TQ pB 8B qD Fh P8 B4 S6 Ug Dv IC 2n ci y2 gn zS LX aE 3Z sr UY 23 3v z4 EX Fb 62 XJ bK Td t5 KC Rk Yi Y0 SV QK L8 57 J3 3x zH od 7H na 1S Qf NH uV Iu Bd 9m yz FA y1 uY aK ZI 6A zU 5y Ts 25 xl s4 FF Tj 8M HD aC jb 23 u7 9D WC eJ fT Bk XC da OM Qx 6c gB 5M q9 Zg 5h uW YY qw et sK cR To DP qM J9 1p w0 zI dR dh 51 Bu NH uD 0Q h6 0t QF lI Kv o1
Warning: Invalid argument supplied for foreach() in /www/wwwroot/ijackey.com/wp-content/plugins/scheme-plus/scheme-plus.php on line 112
深入理解正则表达式 - i'm jackey - i'm jackey

深入理解正则表达式

Jackey PHP 1,057 次浏览 , 没有评论

正则表达式基础

  • 完整的正则表达式是由两种字符组成。特殊字符(元字符)和普通字符(文本)
  • 示例:/^\d+hello.*/
    • ^\d + .* 都是元字符
    • hello是文本字符

元字符

常见的元字符
  • . 匹配除换行符意外的任意字符
  • \w 匹配字母或数字
  • \s 匹配任意的空白字符
  • \d 匹配数字
  • \b 匹配单词的开始或结束
  • ^ 匹配字符串的开始
  • $ 匹配字符串的结束
  • \xxx 查找以八进制数xxx规定的字符
  • \xdd 查找以十六进制数dd规定的字符
  • \uxxxx 查找以十六进制数 xxxx规定的Unicode字符

字符转义

  • tesh\.php匹配tesh.php
  • c:\\windows匹配c:\windows
  • 2\^8匹配2^8(通常这是2的8次方的书写方式)。

思考

333333\$33\33333
要匹配上面字符串的“\$”正则应该怎么写?
如果在PHP中preg_match函数分别用单引号和双引号的表达式来匹配上面的\$,怎么写?
答案:
表达式需要的正则是\\\$
用单引号表示上面的字符串\\\\\$
用双引号表示上面的字符串\\\\\\\$
  1. <?php
  2. $uids = '33333\$333\3333';
  3. $uids = preg_match_all("/\\\\\\\$/", $uids, $matchs);
  4. // 双引号中 \\ 转义输出一个 \, \$ 转义输出 $
  5. $uids = preg_match_all('/\\\\\$/', $uids, $matchs);
  6. // \s单引号内不会转义,输出 \$,\\会转义,输出一个 \
  7. print_r($matchs);

多选结构

  • Windows98|Windows2000|WindowsXP
  • ^Windows98|Windows2000|WindowsXP$
  • Windows(98|2000|XP)
上面三个正则表达的含义一样么?
多选结构可以包含很多字符,但不能超越括号的界限。

分组

我们已经了解怎么重复单个字符;
但如果想要重复一个字符串该怎么办?你可以用小括号来指定子表达式(也叫做分组)。
(\d{1,3}\.){3}\d{1,3} 简单的IP地址匹配表达式
但是它也将匹配256.300.888.999这种不可能存在的IP地址。你能写一个更准确的正则?
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

后向引用

  • 使用小括号指定一个子表达式(分组)后,匹配这个子表达式的文本可以被捕获,从而在表达式或其他程序中作进一步的处理。
  • 默认情况下,每个分组会自动拥有一个租号,规则是:以分组的左括号为标志,从左向右,第一个分组的标号为1,第二个为2,以此类推。
示例:
\b(\w+)\b\s+\1\b 可以用来匹配重复的单词
匹配诸如:where where go, tom tom happy

环视(零宽断言)

  • 环视不匹配任何字符,只匹配文本中的特定位置。类似于\b,^,$那样。环视不会占用字符。
  • 环视分为顺序和逆序两种

    顺序(?=exp)位置的后面能配置exp。例如:(?=\d)当前位置右边是数字。(?!exp)位置的后面不能匹配exp。例如:(?!\d)当前位置右边不能是数字。逆序(?<=exp)位置的前面能匹配exp。例如:(?<=\d)当前位置左边是数字。(?<!=exp)位置的前面不能匹配exp。例如:(?!\d)当前位置左边不是数字。

环视示例:
(?=jeffrey)jeff
jeff(?=rey)
上面两个表达式是等价的么?
答案:是完全等价的。
环视为数值添加逗号
5345678986
5,345,678,986
分析:
我们需要找到一个位置,并将‘位置’替换为‘,’。
这个位置需要符合下面几个条件。
①左边必须有数字
②右边的数字是3的倍数
答案:
  1. $string = '5345678986';
  2. $pattern = '/(?<=\d)(?=(\d{3})+$)/';
  3. $replacement = ',';
  4. echo preg_replace($pattern, $replacement, $string);

贪婪与懒惰(匹配优先与忽略优先)

  • 当正则表达式中包含能接受重复的量词(制定数量的代码,例如+,*,{3,12}等)时,通常的行为是匹配尽可能多的字符。
  • 表达式:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,他会匹配整个字符串aabab。这被称为贪婪匹配。
  • 我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的量词都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就以为着匹配任意数量的重复,但是能使整个匹配成功的前提下使用最少的重复。
  • a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab和ab。
示例:
  1. <?php
  2. $string = 'aaabaab';
  3. $pattern1 = '/a.{1,10}b/';
  4. $pattern2 = '/a.{1,10}?b/';
  5. preg_match_all($pattern1, $string, $matchs1);
  6. preg_match_all($pattern2, $string, $matchs2);
  7. var_dump($matchs1);
  8. var_dump($matchs2);

正则的引擎

正则引擎主要可以分为两大类:一种是DFA,一种是NFA。
  • NFA表达式主导(以表达式为主,顺序去匹配文字)
  • DFA文本主导(以文字稳住,顺序去匹配表达式)
  • 解释正则表达式/pe(nciil|mcil|ncil)/尝试匹配“this is pencil”两种引擎的不同。
一般而论,DFA引擎则搜索更快一些。但是NFA以表达式为主导,更容易操纵,因此一般程序员更偏爱NFA引擎!

如何判断当前程序使用的引擎?

是否支持忽略优先量词和分组捕获?
支持 NFA
不支持 DFA
使用DFA引擎的程序主要有:awk,egrep,flex,lex,mysql,procmail等;
使用传统型NFA引擎的程序主要有:
GNU Emacs,java,ergp,less,more,.NET,PCRE library,perl,php,python,ruby,sed,vi;

回溯

  • NFA引擎,最重要的性质就是它依次处理各个自表达式,遇到需要在两个能成功的可能中进行选择的时候,他会选择其一同时记住另外一个,以备可能得需要。
  • 回溯就像是在道路的每个分岔路口留下一小堆面包屑。
  • 如果需要再“进行尝试”和“跳过尝试”之间选择,对于匹配优先量词,引擎会优先选择“进行尝试”,而对于忽略优先量词,会选择“跳过尝试”。
  • 距离当前最近存储的选项就是当本地失败强制回溯时返回的。使用的原则是LIFO。
  • 回溯时NFA的灵魂。
下面匹配的结果是?
“.*”与”.*?”
分别匹配
This names “Mcdonald’s” is said “makudonarudo” in Japanese.
回溯示例
a.*t 匹配 abcdefghijklmnopqrst
a.*?t 匹配 abcdefghijklmnopqrst
测试两者的效率(避免回溯,提高表达式的效率)

PHP常用的模式修饰符

  • i 大小写不敏感匹配
  • m 增强的行锚点模式
  • x 空白和#注释将被忽略
  • s 点号元字符匹配所有字符,包含换行符
  • e 将替换后的字符串作为php代码评估制定

下面的写法正确么?

preg_match_all(‘!a.{1,10}b!’, ‘aaabaab’, $matchs);
preg_match_all(‘+a.{1,10}b+’, ‘aaabaab’, $matchs);
答案:正确

PCRE的分隔符

PCRE需要由分隔符闭合包裹。
分隔符可以使任意非字母数字、非反斜线、非空白字符。
  • /foo bar/
  • #^[^0-9]$#
  • +php+
  • %[a-zA-Z0-9_-]%

PCRE的主要函数

  • preg_grep 发挥匹配模式的数组条目
  • preg_match 执行一个正则表达式匹配
  • preg_match_all 执行一个全局正则表达式匹配
  • preg_filter 执行一个正则表达式搜索和替换
  • preg_replace 执行一个正则表达式的搜索和替换
  • preg_replace_callback 执行搜索并且使用一个回调进行替换
  • preg_split 通过一个正则表达式分割字符串
  • preg_quote 转义正则表达式字符
  • preg_last_error 返回最后一个PCRE正则执行产生的错误代码

表达式的优化

  • 化简量词
    .*与(?:.)*在逻辑上是相等的,但是前者速度要更快,引擎内部做了优化。
  • 尽量使用非捕获的括号(非捕获的:(?:))
  • 消除不必要的字符组
    [.]与\.在逻辑上是相等的,但是后者更快
  • 字符组优于多选结构
    [abc]优于a|b|c
  • 忽略优先还是匹配有限,具体情况具体分析
    同样情况下,匹配优先速度更快

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Go