掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 1271|回复: 7

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

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

    [LV.7]常住居民III

    发表于 2018-6-12 02:21:09 | 显示全部楼层 |阅读模式
    本帖最后由 cixiplc66 于 2018-6-12 09:50 编辑
    , x5 d5 R  W% Z- ?$ Q3 _
    1. <(?:[^<>]++|(?R))*>
    复制代码
      w3 q. Q. P/ N& X. j1 \
    * N6 L0 J0 V0 s! r0 h! S
    <(?:[^<>]++|(?R))*>) D& h% G/ \. w( a1 L3 T

    , O7 _- A2 O, L7 i/ m匹配到尖括号之间内容,允许内部多次嵌套  D! P. ?) c) ^* W  i
    核心: (?R) 7 P% B0 h5 K1 `$ O% N! p
    平衡组递归匹配5 N& L, n. U$ S9 c/ g) Q/ `, G
    这个是Autohotkey脚本软件作者Lexikos亲手所出,绝对牛逼高人!
    ' m/ a- `# m9 A+ E
    3 E. a; X/ y3 F6 f/*
    $ i  {) p1 l# R) ?/ }$ }正则递归 by_Lexikos
    ) n% @/ U7 Y3 y4 p它可以与“递归调用”结合来删除任意数量的嵌套<...>:
    4 S5 ~" T! ]: c/ W5 D; U% c( p" _
    一个特殊的项目由 (? 后面跟一个大于的数字组成零和一个右括号
    6 k" f# h  B. Y/ F是子模式的递归调用给定的数字,只要它发生在子模式内。 " p8 e$ v8 T3 _3 P0 p4 O
    (如果不是,这是一个“子程序”的调用,这在下一个部分中有描述,)
    9 }8 D0 T& J" ^" ?! e特殊项目 (?R) 或 (?0) 是整个递归调用正则表达式。/ [; |) Z: O* Y, e2 d

    1 ^% L8 p2 e/ ^3 D) A4 J8 t这个PCRE模式解决了嵌套的括号问题  `$ a7 E( x/ \, v: h; J3 b
    (假设PCRE_EXTENDED选项设置为忽略空白):* f8 z- N5 B7 i- B9 z# c  ?
    \( ( [^()]++ | (?R) )* \)
    - F) q8 o* e# |/ h8 D/ P0 y! p: u* v- t8 S6 V
    首先它匹配左括号。4 d0 V* j' U, i8 A8 s. s* `
    然后它匹配任何数量的可以是非括号序列的子字符串,! _9 g' ^0 h" H& i8 r& l
    或者a模式本身的递归匹配
    6 I0 e& I: j- L1 p- @7 H+ U(也就是说,一个正确的parenthe-大小的子字符串)。
    ; v$ P2 m/ P& @2 @; ]8 k最后有一个右括号。请注意使用的所有格量词,
    0 w0 b+ ~$ F  g3 Q$ b: s$ R" w8 s以避免回溯成非序列的序列,括号。
    * `0 L& p! o* \9 W, ~
      q, K4 V; U# t5 x7 VSource: http://www.pcre.org/pcre.txt. C9 Z1 a& F3 U+ @) u
    https://autohotkey.com/board/top ... d-text-in-a-string// G2 g9 H5 |- [- b+ N
    */
    6 G+ N! n" w4 |- j; _
    ) [" k% s/ v9 e+ [7 ^# kEmeditor 完美支持 (?R) 递归语法
    + y, ?1 Y8 H9 d% b2 t& }% z/ b
    1 Q' h+ a6 z# l8 Z附上语法解释:
    " c  `* o: [. G  q" O8 ~# b7 c# w+ ^; f[DEELX 正则表达式扩展语法:递归表达式 - CSDN博客](https://blog.csdn.net/technofiend/article/details/49905127)& G7 O- W1 W: U5 t: Q) }5 m
    % |5 I: y; T2 ?9 m: ^# G5 P
    百度能搜到的唯一一篇讲解的比较清楚的关于(?R)正则递归
    ' Z# \; s# W- ?# a[php匹配嵌套括号内的文本 - xubaoguo - ITeye博客](http://xubaoguo.iteye.com/blog/941406)
      z) N- I- j1 X0 r
    1. (a(b(c)d)(ggg)e))+ B9 Y" |: V5 R: K4 O! r' x

    2. & O3 d$ e, ~+ a7 y2 ]: s1 a4 [: L
    3. \(([^()]+|(?R))*\)
    复制代码

    , s0 ~0 ]0 O. G, O9 M$ A
    ; a- l% r% w9 k. |% n7 ?7 I  F和Lexikos版本主要区别未使用?:不捕获存档组: ^+ s+ B0 r; F* [9 Q) s
    Lexikos大使用了2个加号++,不知道是不是针对一些特别的换行符而考虑- o+ f7 r( r4 k2 s4 K; u
    9 Z! A8 I  _( u) W8 E: n0 N
    几个变形:$ W' R' C) |' [! _! a% |9 ]
    1. \((?:[^()]+|(?R))*\)' }, w4 R  s  [1 N( O

    2. 3 w" H. I+ Q; R) B
    3. \((?>[^()]+|(?R))*\)
    复制代码

    - I# A; S& v; K! J$ [% e具体区别还要慢慢体会

    评分

    2

    查看全部评分

    本帖被以下淘专辑推荐:

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

    [LV.7]常住居民III

     楼主| 发表于 2018-6-12 02:26:04 | 显示全部楼层
    本帖最后由 cixiplc66 于 2018-6-12 02:32 编辑
    7 ]' T4 j: g" k7 m( r
    2 G9 \6 d; N$ z/ X! \+ O. v?: 后面加上 span class="kwd"+ I* Q* o1 [0 X% P
    应该能完美匹配到指定标签了,没测试
    9 B4 Q+ z: @) K4 L, Q如此简洁匹配到嵌套尖括号也可以换成圆括号的正则表达式,百度了一天我还搜不到
    $ V  V# i% w, K# h% R" }) P) ?: `/ G. \/ d+ u
    德国人的英语,Google的翻译也只能凑合看
  • TA的每日心情
    慵懒
    2018-11-26 11:30
  • 签到天数: 130 天

    [LV.7]常住居民III

     楼主| 发表于 2018-6-12 03:52:44 | 显示全部楼层
    再送同样是ahk_L版本老大@lexikos : remove blank lines
    . P- h4 u, |* J$ C/ I$ J收藏级的去行首行尾空白同时去空行的正则4 Q- x! O4 V7 t/ A$ A. W
    + u7 S- T/ D5 n- s3 i; T9 K% [- I# k
    正则替换0 B5 c( ~  E( n) C0 M" B, m
    1. ^\s+|\s*(\R|$)\s*
    复制代码

    " O! E, W, Y; a( X7 y替换为\1
    6 o+ L9 A. d- X1 L/ b
    9 a7 [- q1 {1 V0 b+ L-----------------------✂-----------------------
    8 ]/ i) p2 r+ H- Y2 b) ~7 K同样效果:6 i* H) a  N  n& u5 ]

      ]1 e( H  e* B) z4 q
    1. `am)^\s+|\h+$|\R\z
    复制代码
    匹配部分替换为空
    ( Z8 k5 y9 n# I& ?" n) a; \& K注意 `am)是ahk脚本中语法,表示开启识别多种换行符和匹配多行开头结尾模式; F: ~$ c# W& c& o. ^+ P! N

    评分

    1

    查看全部评分

  • TA的每日心情
    慵懒
    2021-11-14 17:58
  • 签到天数: 999 天

    [LV.10]以坛为家III

    发表于 2018-6-12 07:26:46 | 显示全部楼层
    请问
    2 H; S0 Y+ _  [- d! D如果是想筛选出尖括号<>以外的内容呢?
    3 j6 ]# V% D; K2 B- M) J比如A12<DE>F907G4 g/ M: J4 ]( o7 d7 H% i
    选择<DE>之外的内容
    2 |' \" a6 m) t2 c7 A/ B2 h
    & Z3 |4 }2 {1 a* O8 G9 G: O( C& s6 |谢谢
  • TA的每日心情
    慵懒
    2018-11-26 11:30
  • 签到天数: 130 天

    [LV.7]常住居民III

     楼主| 发表于 2018-6-12 09:15:08 | 显示全部楼层
    本帖最后由 cixiplc66 于 2018-6-12 22:46 编辑 5 Q8 a6 h, n$ f

    " L( }+ r& Q' ?6 F9 H1 u你这样的需求一般是html源码转txt / m) E* d% h+ n" [9 J
    多数是直接匹配 <[^>]*?> 然后替换为空,倒无需考虑嵌套 反而简单了% E1 g# j0 g# P8 R& ^0 \; K
    ' X( r) ?* h+ x$ g
    备注:
    + i. z8 Q& p) z% l: R5 U- D[^>]也可以用英文句号圆点 . 代替,
    " i5 Y% \$ p" r( P  ]( s) w不过小圆点 . 有局限,除非开启 s 模式否则不能匹配到换行符,也就是只能处理一个看得见的行内" a6 t' [3 f) j2 m) e/ B' Q
    ,默认情况下正则把整个文本看做一行
    4 N/ }. s* i2 W- M& c( l5 U3 U2 @& B小圆点 . 要处理跨行 开启 s 模式
    6 m5 B. j* a" G1 i^ $ 这2个行首行尾位置标记要处理跨行的内容,要开启 m 模式,其中有3个很少见到的类似效果的 \A \z \Z
    : j$ A# E: R3 v6 j( P0 ^4 u\A 全文开头 \z全文结尾位置
    + i5 \( E0 s1 G0 U5 V" r\Z 无须开启 m 多行模式 就可以匹配行尾和全文结尾: ^$ B- _0 d1 X; ~
    \R 默认就能代替各种换行符,比\n 灵活出问题少,各种系统搞出来的文本的换行符很复杂,最常见的也有 \r \n \r\n这三种可能
    ) G+ \) X& i5 o( E% H9 W1 I# w7 [
    2 g. ~9 F: B8 A# Y, o3 n3 @\K 作用类似于逆向回顾,用于前面是某某某一些字符,比如: a\Kbc 能匹配到bc但是bc前面必须有个a8 U2 j* Z8 v2 V( |" H  q
    类似于 (?=a)bc+ n5 v$ e0 L/ @
    9 D4 v+ q- G6 o8 h' g% y2 Z$ W2 T
    所有全角双字节字符含标点- h7 |9 R+ M  Z/ `
    1. [[:unicode:]]3 J" M7 _$ N; l+ ]

    2. 1 h) E8 x; l$ T' O+ h* z% c
    3. 等同于 [^\x00-\xff]
    复制代码

    & b& ^3 ?) \  V
    % S3 G& O! |) ^8 l
    * Q- S& z+ v# m中日韩双字节全角字符
    , s+ q. K# J( x6 ]$ [$ u# |5 T7 W! x
    1. 含生僻字中文[\x{2E80}-\x{FE4F}]+ y6 Z8 p: K! ^, {& ]1 l7 O: N
    2. [\x{3000}-\x{9FFF}] XeCJK 中日韩) [$ z1 p! {9 X6 V! ]3 p3 \, z) O
    3. // 汉字范围 [\x0391-\xffe5]
    复制代码
    0 F3 V  w2 l" Y  \7 ?
    5 w* l% ]# ]5 T) P/ r
    中文标点' Z- _' [9 U0 f# N" y+ H. y
    1. [\x{3000}-\x{301e}\x{fe10}-\x{fe19}\x{fe30}-\x{fe44}\x{fe50}-\x{fe6b}\x{ff01}-\x{ffee}]0 v( N8 q3 n* f" C$ s
    2. [中文标点符号unicode码 - CSDN博客](https://blog.csdn.net/miyunhong/article/details/43528897)
    复制代码

    : R7 c+ k4 e. W( C4 i; R, f, ^( V( @$ n: E" B
    英文标点
    5 q: J  J% R, W0 i
    1. [[:punct:]]1 S# U1 y2 u2 q. H) i
    2. \p{Punct}
    复制代码

    4 j$ C) Z8 E4 N) h. K9 i. C/ q+ X+ b2 Y. A
    1. \p{L} 等于 [a-z]
      + D0 I8 F  r6 t4 R
    2. \p{U} 等于[A-Z]
    复制代码
    1 k  d* i/ m. u
    $ o$ l3 U7 ?2 D
    匹配某些特定图片img标签,0 ~: T- y. |* ~+ y: A6 u: X
    1. 允许src有时候不紧跟在 <img 后面6 L6 j1 b, Z: b( z; y& {
    2. src= 后面可能英文或中文引号,如果可能没有引号还得改为 ['"]?
    2 t. X/ }5 b+ i: H. t5 I+ k" D6 J2 d
    1. <img[^>]+src=['"]img/spkr_[^>]+>
    复制代码

    9 R3 N3 r4 ]6 P; S4 i) X( |
    * b7 l6 h$ V* d1 g$ R' u双引号的问题
    % {2 w2 {- j5 V6 O* @8 n1 T多数时候正则中的双引号是个需要特别处理的,比如在一些脚本中,需要连续2个 "" 来代表 一个 "  e' R9 G8 x& k3 [9 B' x# ~
    只是在一些编辑器中好像又不需要特别处理
    4 `2 Q' u- w  S* W: x5 i" c

    评分

    1

    查看全部评分

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

    [LV.6]常住居民II

    发表于 2019-1-12 00:08:29 | 显示全部楼层
    ++是为了开启“侵占模式”:走过的路不回头。
  • TA的每日心情

    2023-7-8 15:11
  • 签到天数: 304 天

    [LV.8]以坛为家I

    发表于 2020-7-14 17:25:44 | 显示全部楼层
    html转txt必备良品,之前自己一个一个标签去匹配真是蠢到家了,收藏了
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

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

    GMT+8, 2024-4-25 10:31 , Processed in 0.063151 second(s), 11 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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