掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 1720|回复: 7

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

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

    [LV.7]常住居民III

    发表于 2018-6-12 02:21:09 | 显示全部楼层 |阅读模式
    本帖最后由 cixiplc66 于 2018-6-12 09:50 编辑 8 @$ _1 v, j/ p. Z" e. T- t+ g
    1. <(?:[^<>]++|(?R))*>
    复制代码
    , v( A9 V% ~  |& e& g( _
    6 }: M' v: B6 ^. Y1 l. ]
    <(?:[^<>]++|(?R))*>( Z- y: W2 _' {

    9 }5 f+ |9 `. ~# T3 H  ~( Y. ]匹配到尖括号之间内容,允许内部多次嵌套8 C! @4 V3 d2 O. x1 c* @
    核心: (?R) " z) k) I5 p) p/ T+ B9 g
    平衡组递归匹配" I4 a$ J( W; R% _: W
    这个是Autohotkey脚本软件作者Lexikos亲手所出,绝对牛逼高人!; p( f8 o3 x# r7 O; I# @

    3 o: @0 |  i  i/*
    , A: Q4 x: i0 W& T正则递归 by_Lexikos1 j: B5 A: l! _9 M
    它可以与“递归调用”结合来删除任意数量的嵌套<...>:3 P# B3 b6 e3 W3 C
    ; u7 u, H2 H2 `/ E/ ]9 \: j
    一个特殊的项目由 (? 后面跟一个大于的数字组成零和一个右括号
    ' E+ l  ~! D  ]# k是子模式的递归调用给定的数字,只要它发生在子模式内。
    7 T1 `7 f, G- j4 p. ^4 X, z(如果不是,这是一个“子程序”的调用,这在下一个部分中有描述,)  {( B7 r# y% B7 k
    特殊项目 (?R) 或 (?0) 是整个递归调用正则表达式。
    , x# l! p) v  h% [& U
    6 h3 \6 r# J* m, K这个PCRE模式解决了嵌套的括号问题4 M' a' X3 A4 n4 _
    (假设PCRE_EXTENDED选项设置为忽略空白):
    2 i0 g. m1 {* y; N1 O" f$ V\( ( [^()]++ | (?R) )* \): x  z# H8 {" J7 B! r# Y

    - y% ^. h9 F8 k: n% i首先它匹配左括号。6 z- C( C7 O' p! L
    然后它匹配任何数量的可以是非括号序列的子字符串,
    4 T2 |1 X1 Y5 t9 H/ ^% w  `或者a模式本身的递归匹配( o; U% H  \9 z, X8 ~
    (也就是说,一个正确的parenthe-大小的子字符串)。
    ' x6 b; v, ?7 E5 a: M9 P最后有一个右括号。请注意使用的所有格量词,4 e; u: i8 B! v4 Z7 i
    以避免回溯成非序列的序列,括号。
    1 h1 i$ }, g8 V; M) N
    3 w0 O" O# v- S& j5 Z6 t3 C( G& ~Source: http://www.pcre.org/pcre.txt
    5 m0 c4 e) R2 J  l) _4 Lhttps://autohotkey.com/board/top ... d-text-in-a-string/
    : H* |  [! N; R*/% r1 M6 N8 q# e2 z2 b3 k' l
    * {) ?1 L0 x* R0 r- m6 K4 J
    Emeditor 完美支持 (?R) 递归语法" `% G2 j6 D; s. c; d! p% i+ Q; G
    1 V2 r4 D$ O" v* J
    附上语法解释:2 O- a) M& k( N( p- t8 ^
    [DEELX 正则表达式扩展语法:递归表达式 - CSDN博客](https://blog.csdn.net/technofiend/article/details/49905127)
    . p, b: l$ {$ p; g9 [( D: @3 C- ]3 n7 Q2 \* A* b1 ~2 }  h+ A% Y; h8 h
    百度能搜到的唯一一篇讲解的比较清楚的关于(?R)正则递归9 @& k3 ^( s9 Q' m" b" d
    [php匹配嵌套括号内的文本 - xubaoguo - ITeye博客](http://xubaoguo.iteye.com/blog/941406)
    * F4 B+ e; [7 c: z8 Q) H
    1. (a(b(c)d)(ggg)e))4 \5 n) l, D) R, v3 Z# B7 D

    2. # D! q1 Z- Y) U) o/ p* l
    3. \(([^()]+|(?R))*\)
    复制代码

    ( \$ y! ~' W0 H# k8 f' |1 q; J4 ^/ b. B/ v) I2 p3 n7 d
    和Lexikos版本主要区别未使用?:不捕获存档组3 U' i' J4 g2 b& K' G4 ^; ]: K
    Lexikos大使用了2个加号++,不知道是不是针对一些特别的换行符而考虑
    7 _( ]/ {7 i1 ?
    , F8 X/ d! @7 r* k/ H7 V几个变形:# t2 G# T2 O# }5 G
    1. \((?:[^()]+|(?R))*\)3 I& O. g' P$ a1 u8 I$ O: `0 E9 c

    2. " x2 b& O" L& n% l3 c* x% F8 X9 A
    3. \((?>[^()]+|(?R))*\)
    复制代码
    * X4 H* n; z/ m+ N
    具体区别还要慢慢体会

    评分

    2

    查看全部评分

    本帖被以下淘专辑推荐:

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

    [LV.7]常住居民III

     楼主| 发表于 2018-6-12 02:26:04 | 显示全部楼层
    本帖最后由 cixiplc66 于 2018-6-12 02:32 编辑
    * z4 t. M3 G& v$ V; X5 V9 r5 J, B* F) I
    ) w4 P: ?+ V' ]?: 后面加上 span class="kwd"7 p9 d7 |3 }& u& X  c0 i
    应该能完美匹配到指定标签了,没测试6 y+ C% G" r/ B+ ?
    如此简洁匹配到嵌套尖括号也可以换成圆括号的正则表达式,百度了一天我还搜不到0 _& [2 S4 G0 ]! I, E

      @6 e" ^  M& l1 B德国人的英语,Google的翻译也只能凑合看
  • TA的每日心情
    慵懒
    2018-11-26 11:30
  • 签到天数: 130 天

    [LV.7]常住居民III

     楼主| 发表于 2018-6-12 03:52:44 | 显示全部楼层
    再送同样是ahk_L版本老大@lexikos : remove blank lines, u3 i5 U8 F& q8 |% q7 ?7 Z5 [
    收藏级的去行首行尾空白同时去空行的正则
    1 E. k' Q) c6 P3 r5 Z8 [' i- q; h
    $ H8 |! N- n6 f8 y# c( s5 w6 J7 O. n正则替换
    0 o( w' g2 `0 H* k5 E. I& X# H
    1. ^\s+|\s*(\R|$)\s*
    复制代码

    + x- ]+ E3 M2 A0 \替换为\18 ^. L0 X  b- J: }+ c/ s
    2 ]0 R) K4 z% a. g% y2 r
    -----------------------✂-----------------------  ?4 j1 H) Y# l/ Q5 H
    同样效果:
    ) Z. |, z" h9 ]8 q7 r* Z' R, s* C0 r3 T. B
    1. `am)^\s+|\h+$|\R\z
    复制代码
    匹配部分替换为空
    . ]9 C% ?$ t9 @& u( j" H注意 `am)是ahk脚本中语法,表示开启识别多种换行符和匹配多行开头结尾模式* d7 m: B/ V7 v- O$ j: u

    评分

    1

    查看全部评分

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

    [LV.10]以坛为家III

    发表于 2018-6-12 07:26:46 | 显示全部楼层
    请问
    ( W6 q0 h5 n4 L/ A) j1 H3 X! p如果是想筛选出尖括号<>以外的内容呢?# H" h6 X* }$ x. V( d
    比如A12<DE>F907G! q! |5 T$ W9 X9 }6 y
    选择<DE>之外的内容( F" V! G& D/ U5 Q0 t
    9 |0 M: B- b2 [) x, I6 P* R4 P# n" K
    谢谢
  • TA的每日心情
    慵懒
    2018-11-26 11:30
  • 签到天数: 130 天

    [LV.7]常住居民III

     楼主| 发表于 2018-6-12 09:15:08 | 显示全部楼层
    本帖最后由 cixiplc66 于 2018-6-12 22:46 编辑 * Y+ P, ]5 }; v. g

      Q& G( ^& A" f你这样的需求一般是html源码转txt
    1 l9 _8 |8 j0 t5 y4 M$ ]( y多数是直接匹配 <[^>]*?> 然后替换为空,倒无需考虑嵌套 反而简单了4 l' N; h9 \, a, u/ P& a

    + b; p, L& u# j6 I7 u备注:
    $ @* ~* L/ N" B( J& A9 L[^>]也可以用英文句号圆点 . 代替,
    ) w( F$ w; u! m& x; H不过小圆点 . 有局限,除非开启 s 模式否则不能匹配到换行符,也就是只能处理一个看得见的行内
    + x4 c( j9 Z8 T6 N9 P4 Z% @,默认情况下正则把整个文本看做一行
    9 j  |* E- s9 K8 m* l+ ]小圆点 . 要处理跨行 开启 s 模式# Y# o. n7 b1 p& {; i
    ^ $ 这2个行首行尾位置标记要处理跨行的内容,要开启 m 模式,其中有3个很少见到的类似效果的 \A \z \Z
    4 w* s' r# r1 G& y" L/ @\A 全文开头 \z全文结尾位置 % y) S# Q5 f/ P( v* c& w, t" B& X5 e
    \Z 无须开启 m 多行模式 就可以匹配行尾和全文结尾6 u% w/ O$ h) g, u3 z  `  I' V2 u7 q  x
    \R 默认就能代替各种换行符,比\n 灵活出问题少,各种系统搞出来的文本的换行符很复杂,最常见的也有 \r \n \r\n这三种可能
    . k* X8 B( ~' u- P3 C# ]* O$ ~
    ( b6 t9 q/ z# t, c7 E\K 作用类似于逆向回顾,用于前面是某某某一些字符,比如: a\Kbc 能匹配到bc但是bc前面必须有个a2 {+ P8 M) ^9 h1 C3 E( S$ T
    类似于 (?=a)bc$ g/ C4 O3 h) T4 a% N2 [' w' u' {5 n
    : ]0 `+ d- Y0 c7 i& z- k8 N: Q
    所有全角双字节字符含标点
    4 Q, T& ?  f+ F% U0 N
    1. [[:unicode:]]! ^) U# Z6 ]- c. m
    2. ' K, @# u/ I# G
    3. 等同于 [^\x00-\xff]
    复制代码
    1 s* n4 r7 @  I2 a
    ! D: Z9 x2 R' @# @1 g* n8 h

    4 r: E8 Z  C) \' E中日韩双字节全角字符
      }8 z8 v$ ]- B- [8 j5 s: ^8 s+ Q
    1. 含生僻字中文[\x{2E80}-\x{FE4F}], c2 c# i7 ~8 }8 r+ J
    2. [\x{3000}-\x{9FFF}] XeCJK 中日韩
      / Z6 Z, y$ P) h7 t! j) L0 ~" \" A
    3. // 汉字范围 [\x0391-\xffe5]
    复制代码

    . o6 t; B* ?+ ]0 b( X$ g3 B* }) G# r/ i  }6 ?: \8 ]
    中文标点- t: |; @; _+ o0 j
    1. [\x{3000}-\x{301e}\x{fe10}-\x{fe19}\x{fe30}-\x{fe44}\x{fe50}-\x{fe6b}\x{ff01}-\x{ffee}]
      ; K+ c6 C8 g" O+ X
    2. [中文标点符号unicode码 - CSDN博客](https://blog.csdn.net/miyunhong/article/details/43528897)
    复制代码

    % w3 o% s6 L4 N9 |+ j6 p6 W* B. V. M
    英文标点# g1 y6 e) }4 i
    1. [[:punct:]]. ?! t6 d- _% o  Z# n
    2. \p{Punct}
    复制代码

    " R/ n. \& C+ I) m' s& i& Z& F" x; j2 s' w9 m9 j3 {
    1. \p{L} 等于 [a-z]  L" u5 \- F: M+ ^. E
    2. \p{U} 等于[A-Z]
    复制代码
    , A/ `! g, _* N$ n
    ! d2 r' y9 c4 |- F  D; {1 @
    匹配某些特定图片img标签,/ I4 K" V  W  [' L7 o3 @2 B* L
    1. 允许src有时候不紧跟在 <img 后面
    # c8 q& V) ~: k; [& h( D: w) k% @2. src= 后面可能英文或中文引号,如果可能没有引号还得改为 ['"]?' R* S" `4 u& ?, V) m
    1. <img[^>]+src=['"]img/spkr_[^>]+>
    复制代码
    ) l/ z* _. [- z6 J/ p- w
    $ L" Y  k  \0 H1 @
    双引号的问题8 V- _. i0 @7 v& K! A2 m
    多数时候正则中的双引号是个需要特别处理的,比如在一些脚本中,需要连续2个 "" 来代表 一个 "+ q* M. |( y' N, G
    只是在一些编辑器中好像又不需要特别处理
    8 C  j# k; {: I; o2 u& c% h

    评分

    1

    查看全部评分

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

    [LV.6]常住居民II

    发表于 2019-1-12 00:08:29 | 显示全部楼层
    ++是为了开启“侵占模式”:走过的路不回头。
  • TA的每日心情
    擦汗
    2025-3-22 20:43
  • 签到天数: 314 天

    [LV.8]以坛为家I

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

    本版积分规则

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

    GMT+8, 2025-5-4 07:30 , Processed in 0.026743 second(s), 29 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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