掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 1285|回复: 7

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

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

    [LV.7]常住居民III

    发表于 2018-6-12 02:21:09 | 显示全部楼层 |阅读模式
    本帖最后由 cixiplc66 于 2018-6-12 09:50 编辑
    % C' m( E: {6 A% D" {7 ]
    1. <(?:[^<>]++|(?R))*>
    复制代码
    4 H1 d, w) k. o, ~% Q

    : o( p. j& }4 M3 G# M% B! u3 F<(?:[^<>]++|(?R))*>
    % b% g. P5 i) S" q% Q& p* `( K: C; C1 q# r3 w3 {7 e% {
    匹配到尖括号之间内容,允许内部多次嵌套
    $ i! ^+ K; ?& W" ?7 g( E% S核心: (?R) ( @# g3 G6 u, F3 @
    平衡组递归匹配" g+ v, V# J: l8 o0 a1 J( Y
    这个是Autohotkey脚本软件作者Lexikos亲手所出,绝对牛逼高人!+ j, E" h* |* [; V; u. X  P
    4 {# [0 Q1 n' o- l* Z/ _
    /*
    1 m' Z7 E4 C# q9 F; T. r3 ?正则递归 by_Lexikos4 I; J9 h7 i' ^6 n6 C
    它可以与“递归调用”结合来删除任意数量的嵌套<...>:
    0 x0 |( |4 K7 {7 g! K6 _8 T8 ]% h: b, u+ G' H6 b
    一个特殊的项目由 (? 后面跟一个大于的数字组成零和一个右括号
    6 R% {) o) P$ Y是子模式的递归调用给定的数字,只要它发生在子模式内。
    " u* k- {# B2 G: f6 }% h3 ^- ]5 U(如果不是,这是一个“子程序”的调用,这在下一个部分中有描述,)
    + X+ E  o9 v9 Q! n) C; J特殊项目 (?R) 或 (?0) 是整个递归调用正则表达式。6 l% O6 x2 A1 M% C) s5 I# g

    - Z) Q2 I9 h9 b, B这个PCRE模式解决了嵌套的括号问题
    ; J: ?! y$ K6 ^$ {/ o( h) ~3 ?(假设PCRE_EXTENDED选项设置为忽略空白):( {, _' a' e/ H1 s
    \( ( [^()]++ | (?R) )* \)$ n8 U1 t$ R. W  G+ ?

    & y7 }1 _5 u* I0 M0 U7 p9 w9 k首先它匹配左括号。
    % l" i! }6 i9 t: Y1 G4 `然后它匹配任何数量的可以是非括号序列的子字符串,: E' |0 W' b' n+ V0 F
    或者a模式本身的递归匹配
    ) T" ]0 L! \! y* B$ g  a/ H(也就是说,一个正确的parenthe-大小的子字符串)。
    % L5 ^8 `  @3 w1 V8 \9 I最后有一个右括号。请注意使用的所有格量词,* H; a3 [; Q/ H
    以避免回溯成非序列的序列,括号。6 a8 A8 [7 n) b7 V* S# x

    $ s7 t1 M' H) |$ c! \  g4 L6 b) ?0 zSource: http://www.pcre.org/pcre.txt" E3 @0 d2 j! i+ n: p# c
    https://autohotkey.com/board/top ... d-text-in-a-string/" U; A3 F) E9 G- D+ `4 |* r
    */$ K" _* c. C- p; R8 h
    # H' }! q6 K( a/ l# d) {6 r
    Emeditor 完美支持 (?R) 递归语法
    % D+ r5 L. o* [
    $ \1 Y. [0 `5 q/ l: \附上语法解释:
    # ~% M2 r9 k  N5 M, {. Q[DEELX 正则表达式扩展语法:递归表达式 - CSDN博客](https://blog.csdn.net/technofiend/article/details/49905127)  ?7 ]( G' B9 z: A
    - z2 c! O2 y" W% T) L9 D
    百度能搜到的唯一一篇讲解的比较清楚的关于(?R)正则递归
    9 l/ b5 E  H1 I3 U0 r5 z[php匹配嵌套括号内的文本 - xubaoguo - ITeye博客](http://xubaoguo.iteye.com/blog/941406); V# w8 _! u) N5 r! P
    1. (a(b(c)d)(ggg)e))
        u7 H& l  H; T' R% M  E
    2. 2 w2 F: K# r/ F' d1 i; i& p
    3. \(([^()]+|(?R))*\)
    复制代码

    & _) D0 z0 f# O1 Z7 d
    8 t, b; G3 M3 y( u和Lexikos版本主要区别未使用?:不捕获存档组% X- x0 e( {9 r' F
    Lexikos大使用了2个加号++,不知道是不是针对一些特别的换行符而考虑
    ( `1 y0 G2 @& P8 Q- T; g3 F0 r$ B4 |) W% \$ N! O, Q8 ]
    几个变形:
    % G- `0 R, Q) a- X3 {
    1. \((?:[^()]+|(?R))*\)* ?# C2 o4 p% y0 M( @; R
    2. 4 {( N9 p0 H: _
    3. \((?>[^()]+|(?R))*\)
    复制代码
    , e0 I9 l+ Z- o( L
    具体区别还要慢慢体会

    评分

    2

    查看全部评分

    本帖被以下淘专辑推荐:

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

    [LV.7]常住居民III

     楼主| 发表于 2018-6-12 02:26:04 | 显示全部楼层
    本帖最后由 cixiplc66 于 2018-6-12 02:32 编辑 1 N/ Y. r  e% Z
    7 a4 O' h1 o; Y4 F7 c
    ?: 后面加上 span class="kwd"  A) G7 ]0 P  t4 \4 F4 ^
    应该能完美匹配到指定标签了,没测试2 w! ?3 l+ e% d' g& _
    如此简洁匹配到嵌套尖括号也可以换成圆括号的正则表达式,百度了一天我还搜不到
    ) n' K9 @" ~4 j$ \9 D3 J7 }
    - y/ u" ~4 ?8 v德国人的英语,Google的翻译也只能凑合看
  • TA的每日心情
    慵懒
    2018-11-26 11:30
  • 签到天数: 130 天

    [LV.7]常住居民III

     楼主| 发表于 2018-6-12 03:52:44 | 显示全部楼层
    再送同样是ahk_L版本老大@lexikos : remove blank lines; Q0 p9 ]* N- Z- k5 L" _7 Q
    收藏级的去行首行尾空白同时去空行的正则
    & L& V7 H7 k2 Q' _  P
    ' @$ J: q2 @" H0 y正则替换
    0 J0 w5 O. r2 V# E
    1. ^\s+|\s*(\R|$)\s*
    复制代码
    " n& v* a" [; f
    替换为\1. W0 g+ e9 r$ K# o, ]' B
    & P1 c$ g+ W" E8 y5 ~' {) u
    -----------------------✂-----------------------. L$ ]( A, O8 D! i2 P/ H$ c
    同样效果:1 j; b% N0 |- u5 t. M8 b
    8 a* m4 U. W& K, G
    1. `am)^\s+|\h+$|\R\z
    复制代码
    匹配部分替换为空0 I* u( I# o2 T9 b4 Q
    注意 `am)是ahk脚本中语法,表示开启识别多种换行符和匹配多行开头结尾模式
    - ?' j! F( D. u% k

    评分

    1

    查看全部评分

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

    [LV.10]以坛为家III

    发表于 2018-6-12 07:26:46 | 显示全部楼层
    请问
    + C3 h* J/ T0 p1 U  `如果是想筛选出尖括号<>以外的内容呢?
    4 h1 A' V. W# i* {1 X, I: u比如A12<DE>F907G
    % H5 w- ^- x5 X( ?1 w/ _$ H# L: h选择<DE>之外的内容
    ) G7 U# I2 t4 ?- p" a  q& H& X) A& q$ k6 Z% Y1 q0 J
    谢谢
  • TA的每日心情
    慵懒
    2018-11-26 11:30
  • 签到天数: 130 天

    [LV.7]常住居民III

     楼主| 发表于 2018-6-12 09:15:08 | 显示全部楼层
    本帖最后由 cixiplc66 于 2018-6-12 22:46 编辑
    0 I( l* ]) e  m  k! h% y9 Z; y; {8 X  b, [0 ~; ]
    你这样的需求一般是html源码转txt
    + M( I/ o, y. E$ x# W% D, v1 s多数是直接匹配 <[^>]*?> 然后替换为空,倒无需考虑嵌套 反而简单了( n9 c) B. U. V4 J  I! f
    9 a, S/ ~) ?( A+ B
    备注:" A# c4 u: X$ s
    [^>]也可以用英文句号圆点 . 代替,
    2 a" D0 d: i% H不过小圆点 . 有局限,除非开启 s 模式否则不能匹配到换行符,也就是只能处理一个看得见的行内  T$ K8 V3 k, B% Y2 h9 P
    ,默认情况下正则把整个文本看做一行
    ; N# @# i$ A$ f& f  j小圆点 . 要处理跨行 开启 s 模式
    * P) `/ U  P0 c^ $ 这2个行首行尾位置标记要处理跨行的内容,要开启 m 模式,其中有3个很少见到的类似效果的 \A \z \Z! P$ M& e% k' y& u! E. I( X- ^
    \A 全文开头 \z全文结尾位置 3 j5 Y5 x1 H7 E$ W6 E" C$ M7 l3 E' u
    \Z 无须开启 m 多行模式 就可以匹配行尾和全文结尾4 I3 a3 A9 x: [' b5 h9 r
    \R 默认就能代替各种换行符,比\n 灵活出问题少,各种系统搞出来的文本的换行符很复杂,最常见的也有 \r \n \r\n这三种可能
    5 n( n( d3 c# e( Y
    7 N, d' |) O" b  p5 {% X! l) c\K 作用类似于逆向回顾,用于前面是某某某一些字符,比如: a\Kbc 能匹配到bc但是bc前面必须有个a
    ; O# h0 S9 W8 ?0 F9 V# N$ _- K/ J0 i( l% }类似于 (?=a)bc
    ! a* K- s, O& [" S3 ]8 {/ `4 @9 N+ D# ?+ w" U% l& M8 _
    所有全角双字节字符含标点
    " X: a) }$ m5 P( h9 m( @
    1. [[:unicode:]]
      + n; X$ `! I3 ^
    2. ' v- a' d) S% }
    3. 等同于 [^\x00-\xff]
    复制代码
    ( M- D: a$ @9 V; |
    " d: k# L5 B+ `1 E5 U* O) Z$ g
    ' a  e* n; M0 T, i
    中日韩双字节全角字符) m/ t) n" g( u6 ~
    1. 含生僻字中文[\x{2E80}-\x{FE4F}]
      9 c1 i2 a. ^% L; z
    2. [\x{3000}-\x{9FFF}] XeCJK 中日韩
      3 C. Y8 x; E. I: L: A. @( O5 U% S
    3. // 汉字范围 [\x0391-\xffe5]
    复制代码
    - F% z) ]1 J3 e

    0 N- Y7 w$ \% w3 i: H2 B& D中文标点
    0 ~; V" p4 z8 |) p0 n6 H
    1. [\x{3000}-\x{301e}\x{fe10}-\x{fe19}\x{fe30}-\x{fe44}\x{fe50}-\x{fe6b}\x{ff01}-\x{ffee}]
      + m/ P9 @& p1 J, f- e
    2. [中文标点符号unicode码 - CSDN博客](https://blog.csdn.net/miyunhong/article/details/43528897)
    复制代码

    ; f% ^0 a9 r* |4 T# ]
    6 f- O: T% ^$ o2 U: \英文标点
    * ~+ Z+ e, {  ?) X. t
    1. [[:punct:]]- l1 d6 K5 M5 K& a! u
    2. \p{Punct}
    复制代码
    / ~9 F7 B& x; \" s* n) y- [, J' C

    8 r& W) C. e" j5 l
    1. \p{L} 等于 [a-z]2 f5 v9 a% ]% z, b; W; i& U# k
    2. \p{U} 等于[A-Z]
    复制代码
    + ~+ I6 c) c$ U( X9 F+ r! L
    & i. x2 x. v4 d
    匹配某些特定图片img标签,
    ' W4 c) O4 ~7 @& \9 Q: g1. 允许src有时候不紧跟在 <img 后面
    # R( u; t  `8 P& J2. src= 后面可能英文或中文引号,如果可能没有引号还得改为 ['"]?7 N0 g& G% p4 o5 J, E( U2 @, a
    1. <img[^>]+src=['"]img/spkr_[^>]+>
    复制代码
    ' K- P. t# M% g3 H# O7 C9 k
    ) P1 [4 C1 |$ o) K$ s5 d
    双引号的问题
    " G3 o- A3 F* e* ~9 H多数时候正则中的双引号是个需要特别处理的,比如在一些脚本中,需要连续2个 "" 来代表 一个 "
    ( f& B6 \2 J* P. g% w只是在一些编辑器中好像又不需要特别处理" b% s9 ?6 I% |% _6 ~2 \. U5 W: D

    评分

    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-5-9 12:19 , Processed in 0.053959 second(s), 15 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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