掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 180|回复: 5

[教程] 发一个嵌套标签匹配的正则<(?:[^<>]++|(?R))*>

[复制链接]
  • TA的每日心情
    慵懒
    2018-11-26 11:30
  • 签到天数: 130 天

    [LV.7]常住居民III

    发表于 2018-6-12 02:21:09 | 显示全部楼层 |阅读模式
    本帖最后由 cixiplc66 于 2018-6-12 09:50 编辑
    ' \" o% @) r" C
    1. <(?:[^<>]++|(?R))*>
    复制代码
    " H& r& ~8 x7 d. l1 `9 r7 M# c
    , h, B: l6 f5 U: l" u
    <(?:[^<>]++|(?R))*>  A5 W+ n' G4 r5 E0 Y

    2 c  R5 ^: j4 e+ I8 U9 G匹配到尖括号之间内容,允许内部多次嵌套
    5 {1 I, D6 t2 f8 I  y2 {+ f核心: (?R)   V3 Q( F/ S9 v/ d  b1 N
    平衡组递归匹配
    # Y, ^7 {- b0 e+ ]. C" b# s这个是Autohotkey脚本软件作者Lexikos亲手所出,绝对牛逼高人!2 Q: p6 j# {% L, v) N7 ?) J
    " [  R6 Y! Z$ z6 L2 k8 [/ ^) P6 g
    /*
    " J" C! h  t* I$ Z5 o正则递归 by_Lexikos
    % _2 \  R) y2 m2 j+ @7 a: a它可以与“递归调用”结合来删除任意数量的嵌套<...>:$ T, C0 F& K) \' x
    9 `$ }2 U- s2 Y) W
    一个特殊的项目由 (? 后面跟一个大于的数字组成零和一个右括号2 X) [9 P3 j5 n1 c
    是子模式的递归调用给定的数字,只要它发生在子模式内。 ) {; n9 G. i5 N. v
    (如果不是,这是一个“子程序”的调用,这在下一个部分中有描述,)5 J4 p- }. A$ h+ e4 w
    特殊项目 (?R) 或 (?0) 是整个递归调用正则表达式。5 E4 W2 p; V" G; x3 [% a: i! C8 v
    8 O9 ?" }& Z9 N4 g; T% H7 w0 K* X
    这个PCRE模式解决了嵌套的括号问题
    - F. M. F. z1 ~% Y(假设PCRE_EXTENDED选项设置为忽略空白):
    ; u0 h5 Y9 H+ m2 a6 r9 b7 k* R\( ( [^()]++ | (?R) )* \)7 J* i7 J5 K2 s2 C2 S8 _

    ) G- V" d3 l& s首先它匹配左括号。/ C) i0 J# T, v' U. e/ f
    然后它匹配任何数量的可以是非括号序列的子字符串,
    + G3 f2 h/ e8 j; l; K或者a模式本身的递归匹配. m0 y% ~' @5 y( L
    (也就是说,一个正确的parenthe-大小的子字符串)。
    . ]8 `  U( o2 o7 n最后有一个右括号。请注意使用的所有格量词,
    + Z0 J/ Q. R! C/ X) A: }$ r以避免回溯成非序列的序列,括号。
    $ ]4 e0 Y# g! M) y& k  _0 ]& M  y- R+ w6 E5 s9 d' }6 C; d
    Source: http://www.pcre.org/pcre.txt; j$ X; f! e/ |- J- e# M
    https://autohotkey.com/board/top ... d-text-in-a-string/
    ( N, F0 h( x( Y( d% v; u1 u" g, p8 N*/
    ) i- x1 L$ p- `: g9 E1 _$ `; V, P+ P( ?4 L
    Emeditor 完美支持 (?R) 递归语法  r3 m6 r4 [; r
    % ]5 h) Y  g, T0 |/ a- a% v
    附上语法解释:
    & U" s: Q+ a: G+ R3 g# i' ]( I[DEELX 正则表达式扩展语法:递归表达式 - CSDN博客](https://blog.csdn.net/technofiend/article/details/49905127)7 J  [9 {& B, p. d/ L+ u' s/ a/ T

    " q3 u. E! ^: g. X百度能搜到的唯一一篇讲解的比较清楚的关于(?R)正则递归6 y- L* |' D3 d5 J# }/ M
    [php匹配嵌套括号内的文本 - xubaoguo - ITeye博客](http://xubaoguo.iteye.com/blog/941406)
    " q0 |) A* n4 P# X" ^/ e
    1. (a(b(c)d)(ggg)e))
      " H  ?9 G$ H5 o: D

    2. " [2 Z. _* S/ N7 G! z  Y
    3. \(([^()]+|(?R))*\)
    复制代码
    ) Q9 y5 g1 R. N( E0 m+ G

    8 q! a; a9 q( k$ P( J5 Q和Lexikos版本主要区别未使用?:不捕获存档组
    1 q( E9 z) J0 c5 iLexikos大使用了2个加号++,不知道是不是针对一些特别的换行符而考虑
    5 I7 W1 R" C, D* O) l) A0 \4 _/ c9 s( n/ i
    几个变形:
    2 _& L& K4 D( R( R
    1. \((?:[^()]+|(?R))*\)+ x0 i5 `7 ^! \( Q

    2. - E4 u, |4 q, z
    3. \((?>[^()]+|(?R))*\)
    复制代码

    - F' x) D& x/ R具体区别还要慢慢体会

    评分

    2

    查看全部评分

  • TA的每日心情
    慵懒
    2018-11-26 11:30
  • 签到天数: 130 天

    [LV.7]常住居民III

     楼主| 发表于 2018-6-12 02:26:04 | 显示全部楼层
    本帖最后由 cixiplc66 于 2018-6-12 02:32 编辑 9 X; e% U# V+ ^; f

    5 l% }3 n5 M1 W7 ~' m?: 后面加上 span class="kwd"
    - Y+ t# i  h: [2 Z8 J8 }; P应该能完美匹配到指定标签了,没测试! [) R' m/ g. J+ t# C, Y. D
    如此简洁匹配到嵌套尖括号也可以换成圆括号的正则表达式,百度了一天我还搜不到, Q# O$ d% h& a# Z4 A

    " ~! \4 F. V, P0 f德国人的英语,Google的翻译也只能凑合看
  • TA的每日心情
    慵懒
    2018-11-26 11:30
  • 签到天数: 130 天

    [LV.7]常住居民III

     楼主| 发表于 2018-6-12 03:52:44 | 显示全部楼层
    再送同样是ahk_L版本老大@lexikos : remove blank lines: _1 N8 i5 n8 X
    收藏级的去行首行尾空白同时去空行的正则
    , g2 \3 o1 Y% c( i5 j* K2 B: \4 Q
    * g9 q3 Z7 k) M  L2 H+ y* i6 Q& p正则替换7 `: |8 R# B$ N2 V
    1. ^\s+|\s*(\R|$)\s*
    复制代码

    ( M2 j1 H9 F* ^# t+ g: i替换为\16 R7 u/ H# m4 M: w( M: R: i

    5 G+ X1 r8 K* l# S/ {; W5 |& }-----------------------✂-----------------------
    4 y+ a1 L9 D/ {1 T同样效果:" M) {: x" p  K( p8 l# p2 @" E
    + `# }6 F3 M0 l6 e' V# Z" M
    1. `am)^\s+|\h+$|\R\z
    复制代码
    匹配部分替换为空
    2 t8 c6 q4 a6 Q. B9 M' ~$ w注意 `am)是ahk脚本中语法,表示开启识别多种换行符和匹配多行开头结尾模式
    ( z1 N) B8 b/ q) w5 k

    评分

    1

    查看全部评分

  • TA的每日心情
    慵懒
    昨天 07:15
  • 签到天数: 460 天

    [LV.9]以坛为家II

    发表于 2018-6-12 07:26:46 | 显示全部楼层
    请问2 o9 B9 }- k. u8 j
    如果是想筛选出尖括号<>以外的内容呢?
    $ Z- S% |" G  C比如A12<DE>F907G+ O0 b, l& ~8 H# E2 A! K  M
    选择<DE>之外的内容
    - i1 o$ w8 Z  B7 y) H% Y4 o5 _) z  G% q# M, r% f! L! s5 N: B. l
    谢谢
  • TA的每日心情
    慵懒
    2018-11-26 11:30
  • 签到天数: 130 天

    [LV.7]常住居民III

     楼主| 发表于 2018-6-12 09:15:08 | 显示全部楼层
    本帖最后由 cixiplc66 于 2018-6-12 22:46 编辑 : B' r$ M1 c3 I- `4 Q8 G$ C" L
    + |  J1 I) f% X
    你这样的需求一般是html源码转txt
    + d; `" g9 q; ]8 c4 b; \多数是直接匹配 <[^>]*?> 然后替换为空,倒无需考虑嵌套 反而简单了2 }& y  n* W, [

    + i) l& v7 ^' F; d* D备注:
    9 F8 @7 {% o3 P  W5 v: Q2 H[^>]也可以用英文句号圆点 . 代替,3 k$ @) z+ X& V" A1 A
    不过小圆点 . 有局限,除非开启 s 模式否则不能匹配到换行符,也就是只能处理一个看得见的行内
    + `* F8 [) C- u, z( S- f,默认情况下正则把整个文本看做一行, E3 F& J& Z& h7 v
    小圆点 . 要处理跨行 开启 s 模式
    , D! A( a' B0 E  Q! k$ ~^ $ 这2个行首行尾位置标记要处理跨行的内容,要开启 m 模式,其中有3个很少见到的类似效果的 \A \z \Z
    , S! ?4 H, q0 ?- n( O4 K- K. C\A 全文开头 \z全文结尾位置 ) Y, y! o' K5 s' F( K! `
    \Z 无须开启 m 多行模式 就可以匹配行尾和全文结尾% Q, U/ D" L5 x  \+ e
    \R 默认就能代替各种换行符,比\n 灵活出问题少,各种系统搞出来的文本的换行符很复杂,最常见的也有 \r \n \r\n这三种可能
    4 Z8 d( \+ H& y$ T, f: ?- j
    . b" m' ]0 ~+ D1 W0 N\K 作用类似于逆向回顾,用于前面是某某某一些字符,比如: a\Kbc 能匹配到bc但是bc前面必须有个a
    1 [: Q) O- D7 Z类似于 (?=a)bc
    ! {2 \1 ]8 U4 S6 x/ q
    ( D, B! D+ ?/ C, u5 b5 s/ {9 B. J所有全角双字节字符含标点4 E( C* L6 ~4 E
    1. [[:unicode:]]8 _: u0 z* W, N5 n; ]; P: b
    2. 4 r- }# ~" }3 U4 k
    3. 等同于 [^\x00-\xff]
    复制代码
      L: @5 ?' g8 i. A" C
    4 ~& X% F7 R6 ^  D  Y

      W: B8 ~" b; }' L中日韩双字节全角字符; A& ~( c+ M0 Y" R' a- F
    1. 含生僻字中文[\x{2E80}-\x{FE4F}]3 P  g4 @& x2 a- c- w5 }/ B
    2. [\x{3000}-\x{9FFF}] XeCJK 中日韩, ~; L( R7 Y8 W! K( c5 ?0 J
    3. // 汉字范围 [\x0391-\xffe5]
    复制代码
    / v1 Y# ^$ M6 W

    : V# H, _4 k1 u: b2 C中文标点
    + i& f0 T# N6 [9 l8 A$ F. Q
    1. [\x{3000}-\x{301e}\x{fe10}-\x{fe19}\x{fe30}-\x{fe44}\x{fe50}-\x{fe6b}\x{ff01}-\x{ffee}]
      * W0 x( e0 A! o. a* ^: m, \" g# G
    2. [中文标点符号unicode码 - CSDN博客](https://blog.csdn.net/miyunhong/article/details/43528897)
    复制代码
    ; ]/ X/ p; J; ~1 ?! k: V: y4 U
    3 w& z  d) ]9 ]& r1 U/ M& O
    英文标点4 F% F6 R% i0 M* p6 L2 l; G
    1. [[:punct:]]
      ' F( r: K% Z1 N, P" K" V( q8 M! z8 u
    2. \p{Punct}
    复制代码

    9 t( a) R6 w9 b/ S1 N! `, H; _& ?$ N2 V
    1. \p{L} 等于 [a-z]7 [! E! i0 a+ G- M( w1 g- H. @
    2. \p{U} 等于[A-Z]
    复制代码

    + Q8 e' [* O% P
    " l' o9 O& n' K/ H' S! D匹配某些特定图片img标签,
    , ~$ q3 I$ S  q) a1 O6 V1. 允许src有时候不紧跟在 <img 后面& {& p- `. y/ \8 v1 p
    2. src= 后面可能英文或中文引号,如果可能没有引号还得改为 ['"]?1 a6 n+ E/ ^' O* _
    1. <img[^>]+src=['"]img/spkr_[^>]+>
    复制代码

    4 I+ C0 o, y, m" W* X  f5 L' G. p: C  r9 E- L; F
    双引号的问题
    2 S) ~& p. l1 ~6 s1 A$ x多数时候正则中的双引号是个需要特别处理的,比如在一些脚本中,需要连续2个 "" 来代表 一个 "
    0 a  Q! ^1 v8 V7 K& \6 d只是在一些编辑器中好像又不需要特别处理7 w; Y/ u) s* M5 N  d6 z; L, A

    评分

    1

    查看全部评分

  • TA的每日心情
    无聊
    2 小时前
  • 签到天数: 69 天

    [LV.6]常住居民II

    发表于 2019-1-12 00:08:29 | 显示全部楼层
    ++是为了开启“侵占模式”:走过的路不回头。
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    顶部qrcode底部
    关注公众号送论坛充值码
    关注微信公众平台
    关注微信公众号 pdawiki,获取邀请码,看文抢积分,抽奖得浮云! Follow our Wechat official account "pdawiki", get invitation codes, and play the lottery to earn points (积分)!

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2019-1-23 02:54 , Processed in 0.087614 second(s), 9 queries , MemCache On.

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表