掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 294|回复: 5

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

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

    [LV.7]常住居民III

    发表于 2018-6-12 02:21:09 | 显示全部楼层 |阅读模式
    本帖最后由 cixiplc66 于 2018-6-12 09:50 编辑 + n( c* o& a: e
    1. <(?:[^<>]++|(?R))*>
    复制代码
    " D! [3 ~$ L& w- T6 r1 g

    9 Z+ ^  p! e9 b5 [3 p; l* f<(?:[^<>]++|(?R))*>0 S7 b' d* s4 I

    % g. U# {  V2 h$ D* ?匹配到尖括号之间内容,允许内部多次嵌套
    + ]9 e* n+ F9 N! ]核心: (?R)
      z- ]" r4 @1 c5 t* ]" w平衡组递归匹配
    ( Z' F& y# Y# \$ N- J. O这个是Autohotkey脚本软件作者Lexikos亲手所出,绝对牛逼高人!
    1 T. j3 T% q% k# l9 b3 q% Q  q4 Y# E, B. o) o  @9 \8 x
    /*9 y% \' Z5 @0 T* T6 c4 G# A; k
    正则递归 by_Lexikos6 M$ N; v$ [3 C, e0 Z: G4 R: C/ Y
    它可以与“递归调用”结合来删除任意数量的嵌套<...>:
    - V3 I6 m( j: }# n
    - V* s" x9 j" @; G! n- j一个特殊的项目由 (? 后面跟一个大于的数字组成零和一个右括号
    6 e3 L, Q$ X+ E' d" _' Y是子模式的递归调用给定的数字,只要它发生在子模式内。 ; A2 v, D7 j9 y6 S
    (如果不是,这是一个“子程序”的调用,这在下一个部分中有描述,)
    ( O- t4 j: M: S% l9 L特殊项目 (?R) 或 (?0) 是整个递归调用正则表达式。
    9 Q0 W% O3 B3 ^5 J8 ]6 V! I( H4 F' u  v4 m
    这个PCRE模式解决了嵌套的括号问题
    * z: W& W8 W8 {# I+ u" D(假设PCRE_EXTENDED选项设置为忽略空白):
    $ K* p3 o$ d  `\( ( [^()]++ | (?R) )* \)" g1 H/ [: f* A% S' F* |

    ! \6 A) [7 V! p# }$ m首先它匹配左括号。
    # s: t/ i8 \0 E) J2 A/ X然后它匹配任何数量的可以是非括号序列的子字符串,- y) G$ H2 I/ r9 z
    或者a模式本身的递归匹配0 L% @; k$ A/ e
    (也就是说,一个正确的parenthe-大小的子字符串)。6 k% E9 F& d, V; ]0 w3 A1 I
    最后有一个右括号。请注意使用的所有格量词,& b$ B- m' z, |
    以避免回溯成非序列的序列,括号。
    * t- [# l( L! V% E
    / f# s: ?, |  f4 H( G3 ?, o: mSource: http://www.pcre.org/pcre.txt
    / `) g" @! v3 z+ k- hhttps://autohotkey.com/board/top ... d-text-in-a-string// c/ X4 a8 m. K/ U' o
    */
    " \1 Z2 F4 A' d! a; A* m! z
    , ^; A2 l4 k7 F/ r( t1 YEmeditor 完美支持 (?R) 递归语法. d% I, K* K* U: U
    $ ^, L, F  U2 D. N% H. ^
    附上语法解释:
    . w6 D# ?5 y5 t- [[DEELX 正则表达式扩展语法:递归表达式 - CSDN博客](https://blog.csdn.net/technofiend/article/details/49905127)
      `& b' @) [7 A8 P2 N5 G: E9 f) W% u! s* c$ A" b1 w+ M$ n
    百度能搜到的唯一一篇讲解的比较清楚的关于(?R)正则递归( Z- J+ }: ?4 D2 b# s
    [php匹配嵌套括号内的文本 - xubaoguo - ITeye博客](http://xubaoguo.iteye.com/blog/941406)
    6 V+ {5 ~6 P! p
    1. (a(b(c)d)(ggg)e))% s9 b6 j2 h, y9 c/ t. G/ a/ W+ w' x
    2. 2 y$ z7 h6 @* I' u0 _
    3. \(([^()]+|(?R))*\)
    复制代码

    * ^: g5 H3 }& x1 \
    ' B, N+ O3 H9 u5 B8 ]和Lexikos版本主要区别未使用?:不捕获存档组
    ) B" c9 N' s2 o0 ]; X* y! y7 {Lexikos大使用了2个加号++,不知道是不是针对一些特别的换行符而考虑
    6 K' e7 N$ M# m* r/ h( I! @0 O/ ~  l  u& r
    几个变形:
    / r6 H" D5 V, \2 m$ v
    1. \((?:[^()]+|(?R))*\)* D5 s, s9 ?1 k. l4 Y% G  F
    2. # R! F( G' a9 y. a' a
    3. \((?>[^()]+|(?R))*\)
    复制代码

    % R3 ^' M4 ^" n& D* X/ m* s具体区别还要慢慢体会

    评分

    2

    查看全部评分

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

    [LV.7]常住居民III

     楼主| 发表于 2018-6-12 02:26:04 | 显示全部楼层
    本帖最后由 cixiplc66 于 2018-6-12 02:32 编辑
    * g: ^$ Q- v) ^- g0 l4 j# A
    4 U7 {' |+ Q2 l5 x3 y0 v  e# }, ]?: 后面加上 span class="kwd"
    " t# L' W& K: I3 ]6 @1 {. \; D) `& n应该能完美匹配到指定标签了,没测试2 U4 q# J* A$ ^9 C) ?- ~
    如此简洁匹配到嵌套尖括号也可以换成圆括号的正则表达式,百度了一天我还搜不到' @" x" ?1 e8 q1 E( D; Y+ z# S* W

    4 E- \! H$ Z- {3 x7 a, l3 u1 H/ U& B3 n德国人的英语,Google的翻译也只能凑合看
  • TA的每日心情
    慵懒
    2018-11-26 11:30
  • 签到天数: 130 天

    [LV.7]常住居民III

     楼主| 发表于 2018-6-12 03:52:44 | 显示全部楼层
    再送同样是ahk_L版本老大@lexikos : remove blank lines8 F$ J$ _/ Z/ V2 T
    收藏级的去行首行尾空白同时去空行的正则
    ' j8 i9 {5 s( U  O& |4 M
    $ p# O; E' ]2 r+ H; ?/ H: S6 @正则替换
    : P2 {0 A' g' c% j
    1. ^\s+|\s*(\R|$)\s*
    复制代码

    9 ~" x/ b( N2 M5 c) _! a* ]$ R替换为\1
    % U& U* `* X$ Y' R9 h' s, ^. W8 }9 D$ e- `& S/ ]& l2 h
    -----------------------✂-----------------------
    # d: i1 Q) `+ r0 J% D* U; h同样效果:( E3 g3 M. N' \& p3 D7 R- j

    " @: K9 w& \. I8 |
    1. `am)^\s+|\h+$|\R\z
    复制代码
    匹配部分替换为空- x8 Q2 W& K3 N, l6 C4 L
    注意 `am)是ahk脚本中语法,表示开启识别多种换行符和匹配多行开头结尾模式
    7 p$ h, O1 \5 G( T

    评分

    1

    查看全部评分

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

    [LV.9]以坛为家II

    发表于 2018-6-12 07:26:46 | 显示全部楼层
    请问7 h% z7 s0 N' B# E! [# z
    如果是想筛选出尖括号<>以外的内容呢?
    ' `1 H- y& i& I; p  d# z+ k比如A12<DE>F907G
    $ q8 Q4 Q0 U# h1 D- p) k! r, T选择<DE>之外的内容
    3 T$ d9 X: f' n* ?/ B; |2 \9 ~+ w( ^* t# Y; ^5 r) G+ G7 G% B
    谢谢
  • TA的每日心情
    慵懒
    2018-11-26 11:30
  • 签到天数: 130 天

    [LV.7]常住居民III

     楼主| 发表于 2018-6-12 09:15:08 | 显示全部楼层
    本帖最后由 cixiplc66 于 2018-6-12 22:46 编辑
    ' J0 v3 M; W: Q
    $ k& L1 D  H1 J& d& {, K8 T7 W( a你这样的需求一般是html源码转txt   I- l/ }& d5 d
    多数是直接匹配 <[^>]*?> 然后替换为空,倒无需考虑嵌套 反而简单了
    2 J5 t7 R) ~4 u) C- n  k3 M5 k1 L7 |9 \$ C; v: a! t
    备注:: r  o! c) s+ @! z
    [^>]也可以用英文句号圆点 . 代替," Y0 V) n  j. J) |# x  p* w: b7 k
    不过小圆点 . 有局限,除非开启 s 模式否则不能匹配到换行符,也就是只能处理一个看得见的行内6 a* T: p7 b, h$ I" R9 C
    ,默认情况下正则把整个文本看做一行
    # Q6 l$ r% ]* V5 M5 \: x# ]小圆点 . 要处理跨行 开启 s 模式
    ; _. Y3 a5 p6 U; t& n0 S^ $ 这2个行首行尾位置标记要处理跨行的内容,要开启 m 模式,其中有3个很少见到的类似效果的 \A \z \Z
    & c% d+ i" Z9 m# E8 v\A 全文开头 \z全文结尾位置 3 J) G, M: W) y% Q& W
    \Z 无须开启 m 多行模式 就可以匹配行尾和全文结尾
    & I0 F* J; D0 G8 r$ e! }' l: j, F\R 默认就能代替各种换行符,比\n 灵活出问题少,各种系统搞出来的文本的换行符很复杂,最常见的也有 \r \n \r\n这三种可能' w; _0 N0 C; Z& @
    4 ?& n* X# \& _( p
    \K 作用类似于逆向回顾,用于前面是某某某一些字符,比如: a\Kbc 能匹配到bc但是bc前面必须有个a
    1 X; r7 i5 i3 }类似于 (?=a)bc3 I. R5 V# f' |- n
    ( S$ a( ?& O* p( O6 l8 D  B
    所有全角双字节字符含标点
    1 S8 Z+ t" v) i/ }7 k3 K
    1. [[:unicode:]]
      ; X+ Y, i; B& ^$ A& M1 u4 o6 p

    2. : O8 l( Z+ {2 t" A- v' S" i3 g$ B' \
    3. 等同于 [^\x00-\xff]
    复制代码
    # \+ y1 N! [+ P$ Z) B

    7 ]$ l' g- x) p" M3 X
    $ m9 x! l0 v9 K) v- f中日韩双字节全角字符
    7 E2 W/ z& d, w0 X& i, O) x+ v
    1. 含生僻字中文[\x{2E80}-\x{FE4F}]
      6 C4 z; z2 M& G; y, y! x, i
    2. [\x{3000}-\x{9FFF}] XeCJK 中日韩1 N# j  ?$ g; U0 }: e  k( e
    3. // 汉字范围 [\x0391-\xffe5]
    复制代码

    0 p/ `; ]4 q2 S  k# M- i7 W( Q' x; e, [; M
    中文标点& a( H' a5 z6 `+ ?: t( ^, P/ e* t
    1. [\x{3000}-\x{301e}\x{fe10}-\x{fe19}\x{fe30}-\x{fe44}\x{fe50}-\x{fe6b}\x{ff01}-\x{ffee}]
      . N, w' o" v, _  F
    2. [中文标点符号unicode码 - CSDN博客](https://blog.csdn.net/miyunhong/article/details/43528897)
    复制代码
    + ]" e) U  g- g, P- _

    2 y% [  Q" e% O( A& d3 H: V英文标点
    ! Q. R' M, l: T; f7 O
    1. [[:punct:]]9 c- p/ \& G7 s5 x5 T6 u
    2. \p{Punct}
    复制代码

    # f! Y! X+ I( q, l6 e% W4 x7 u: q1 A. X7 W
    1. \p{L} 等于 [a-z]. D# c/ ~& p+ {& x- |" L4 d
    2. \p{U} 等于[A-Z]
    复制代码
    , i- C4 J1 j& _2 ?8 F8 c* f
    ) B4 d1 o  m2 c
    匹配某些特定图片img标签,
    # L8 \2 q$ k7 u1. 允许src有时候不紧跟在 <img 后面$ e7 _6 t: x. g6 @  J) J
    2. src= 后面可能英文或中文引号,如果可能没有引号还得改为 ['"]?
    $ A- f- W6 p* `) ^$ N6 t: J$ k
    1. <img[^>]+src=['"]img/spkr_[^>]+>
    复制代码
    4 Q. K  ~5 D. I. Y7 ~- Z( |; n7 h8 p

    : X, ]+ n, p" X) c$ B1 M双引号的问题
    6 S6 h) ~! B7 J. b; q多数时候正则中的双引号是个需要特别处理的,比如在一些脚本中,需要连续2个 "" 来代表 一个 "2 _0 s8 b2 `8 @+ w- L
    只是在一些编辑器中好像又不需要特别处理* ]' o9 E' v" x3 ~

    评分

    1

    查看全部评分

  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [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-5-23 00:56 , Processed in 0.103407 second(s), 10 queries , MemCache On.

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

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