掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 1275|回复: 7

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

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

    [LV.7]常住居民III

    发表于 2018-6-12 02:21:09 | 显示全部楼层 |阅读模式
    本帖最后由 cixiplc66 于 2018-6-12 09:50 编辑 # q/ O9 D2 @6 x3 n" \0 U. J% m; ~
    1. <(?:[^<>]++|(?R))*>
    复制代码
    ( L7 J$ Y/ L$ p( z# K
    . x' J' z( Q2 ?* o) y
    <(?:[^<>]++|(?R))*>$ e0 s6 ]" ?7 e/ F2 f% t5 g
    . X3 k  J1 a/ |# _
    匹配到尖括号之间内容,允许内部多次嵌套- h- n7 D2 o. D6 M+ Q( x( O5 |
    核心: (?R) * J+ ^, n. `! Z9 ~! i
    平衡组递归匹配
    ) U, Z# X3 i8 b1 ^+ q; y7 \1 z这个是Autohotkey脚本软件作者Lexikos亲手所出,绝对牛逼高人!# w# o, w1 o# x' s8 W% f( r
    5 N( R- H  B/ Y& B
    /*
    4 z/ X4 F- `7 \- c! y" s$ {, f, b- w正则递归 by_Lexikos
    ) q5 d5 F% ^/ L它可以与“递归调用”结合来删除任意数量的嵌套<...>:% w) m/ G- {6 F7 i
    ! i$ |0 U# L# Y
    一个特殊的项目由 (? 后面跟一个大于的数字组成零和一个右括号
    / V+ j& F* y* Z是子模式的递归调用给定的数字,只要它发生在子模式内。
    - H6 I) h4 Q+ M(如果不是,这是一个“子程序”的调用,这在下一个部分中有描述,)
    , B! P2 k  D$ `/ o7 a/ N* D- s1 |特殊项目 (?R) 或 (?0) 是整个递归调用正则表达式。
      S& `1 c; }5 O+ s( M$ P/ e" x5 |5 m% }2 a
    这个PCRE模式解决了嵌套的括号问题& y3 U% m( r9 l% S
    (假设PCRE_EXTENDED选项设置为忽略空白):) v& }6 @1 b% j! Q0 b+ F! w
    \( ( [^()]++ | (?R) )* \)2 R" B( x9 K# K9 W

    ) D# U" R& n0 u* G7 P" k  i首先它匹配左括号。# S! I, U# }5 n4 e/ K3 }
    然后它匹配任何数量的可以是非括号序列的子字符串,+ L5 y0 h; h6 K7 @% O7 F5 R6 g
    或者a模式本身的递归匹配  N" X0 F8 Y2 @; e8 j
    (也就是说,一个正确的parenthe-大小的子字符串)。
    9 [. f3 L: d" @0 w4 l最后有一个右括号。请注意使用的所有格量词,
    8 Z9 z& k* J, O3 @以避免回溯成非序列的序列,括号。$ ]' ?7 z6 f/ k# w) F; m- ~
    4 n$ e5 v$ d# b6 b
    Source: http://www.pcre.org/pcre.txt
    9 I! L$ S; O" D; D$ Zhttps://autohotkey.com/board/top ... d-text-in-a-string/4 M: N; X" Z$ H6 n3 W4 U
    */
    8 {1 C) P9 A* g! p# E1 v& S4 c! i0 i: N
    Emeditor 完美支持 (?R) 递归语法
    4 _8 y( L- Y8 d; r/ Y1 h' Z7 S% _0 @- j
    附上语法解释:7 d" B. l& ?1 r& j
    [DEELX 正则表达式扩展语法:递归表达式 - CSDN博客](https://blog.csdn.net/technofiend/article/details/49905127)
    ! U+ A. v* L# a: @  M: v$ m( `  v. c" s7 K) @( V0 o. {; l
    百度能搜到的唯一一篇讲解的比较清楚的关于(?R)正则递归* i3 y* z4 g! {
    [php匹配嵌套括号内的文本 - xubaoguo - ITeye博客](http://xubaoguo.iteye.com/blog/941406)
    ) A; J2 Z! D2 ^+ u  \- o+ H
    1. (a(b(c)d)(ggg)e)): s9 a  \" ^( g) i- }6 u
    2. : f& \" i& u9 g8 I
    3. \(([^()]+|(?R))*\)
    复制代码

    - J* S) J% @! v* C2 E) w5 B, M
      R% |& q% p- K- ^, N和Lexikos版本主要区别未使用?:不捕获存档组' V* t- X/ B! W$ A; w, c. ~
    Lexikos大使用了2个加号++,不知道是不是针对一些特别的换行符而考虑
    4 F6 E* T: H) }. M5 a' ~" {) `; S! L# w% r0 n
    几个变形:
    6 B* r, s* U* @* W
    1. \((?:[^()]+|(?R))*\)8 W9 P, f) c# Y9 ~7 Y
    2. : X& G! P* |7 s2 ~( m
    3. \((?>[^()]+|(?R))*\)
    复制代码

    0 ^8 e. m; ~9 Z/ _' w$ Z具体区别还要慢慢体会

    评分

    2

    查看全部评分

    本帖被以下淘专辑推荐:

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

    [LV.7]常住居民III

     楼主| 发表于 2018-6-12 02:26:04 | 显示全部楼层
    本帖最后由 cixiplc66 于 2018-6-12 02:32 编辑
    " R. |' \& U; S6 H$ M& P! L; L( Z; m- n
    ?: 后面加上 span class="kwd"% t3 }* Z( s% K4 C6 D6 {
    应该能完美匹配到指定标签了,没测试0 G7 y% l$ Z, Z! j
    如此简洁匹配到嵌套尖括号也可以换成圆括号的正则表达式,百度了一天我还搜不到( g0 J" z1 S, d6 U/ x5 s* _
    ! R, h4 s* ]% g/ G
    德国人的英语,Google的翻译也只能凑合看
  • TA的每日心情
    慵懒
    2018-11-26 11:30
  • 签到天数: 130 天

    [LV.7]常住居民III

     楼主| 发表于 2018-6-12 03:52:44 | 显示全部楼层
    再送同样是ahk_L版本老大@lexikos : remove blank lines
    1 Y6 _7 t+ m$ j1 e" o' O$ B收藏级的去行首行尾空白同时去空行的正则2 m- w6 F1 ], D& T- G  z- n1 x" G6 W

    6 u! P# l5 U% N1 ?* e正则替换
    ( l& ]0 J( t5 A8 G! E" t8 [1 d
    1. ^\s+|\s*(\R|$)\s*
    复制代码

    9 |, j( v3 s9 p7 l替换为\1, g# I7 s% d/ h) s

    . R& h3 t, l5 r6 }3 i-----------------------✂-----------------------
    $ e0 R/ x  y+ x; ]同样效果:0 T  X( J0 r" ~7 p; D+ ~4 }
    3 e% t7 W% |+ O$ u5 Q! v
    1. `am)^\s+|\h+$|\R\z
    复制代码
    匹配部分替换为空
    : N6 F4 F5 [) ?& s  H6 l- e注意 `am)是ahk脚本中语法,表示开启识别多种换行符和匹配多行开头结尾模式8 v3 K% Y# w- n" A5 D- a, @; x( i, l

    评分

    1

    查看全部评分

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

    [LV.10]以坛为家III

    发表于 2018-6-12 07:26:46 | 显示全部楼层
    请问
      R. |' K" L. u2 [( ^. z5 [, ~7 c如果是想筛选出尖括号<>以外的内容呢?
    3 }% B" W% t! E( b1 P$ j  O6 Q比如A12<DE>F907G
    $ O, p" y1 Y# s+ i8 Y& Z选择<DE>之外的内容7 D+ c; Q' ]/ N! F1 q0 d4 f

    , @5 Q- t7 c. K: S$ ~谢谢
  • TA的每日心情
    慵懒
    2018-11-26 11:30
  • 签到天数: 130 天

    [LV.7]常住居民III

     楼主| 发表于 2018-6-12 09:15:08 | 显示全部楼层
    本帖最后由 cixiplc66 于 2018-6-12 22:46 编辑
    7 U. ?$ a! S! |& X, B9 K. g4 N& v5 z* ~' G9 ^4 u
    你这样的需求一般是html源码转txt
    . Z' `- Z# U3 `& U多数是直接匹配 <[^>]*?> 然后替换为空,倒无需考虑嵌套 反而简单了3 {. p' s/ _2 i0 J

    & S: F) A: \) o) b3 D备注:
    + x1 h8 F2 p% S% C[^>]也可以用英文句号圆点 . 代替,3 c% F8 C# B+ O; ~& h% ^' S9 }- f
    不过小圆点 . 有局限,除非开启 s 模式否则不能匹配到换行符,也就是只能处理一个看得见的行内
    . O0 Y( N9 K# `,默认情况下正则把整个文本看做一行" \% g0 E& S5 B0 M
    小圆点 . 要处理跨行 开启 s 模式+ ^0 ]$ {$ `6 k& @: W1 T" x' X
    ^ $ 这2个行首行尾位置标记要处理跨行的内容,要开启 m 模式,其中有3个很少见到的类似效果的 \A \z \Z4 b$ u' s: g: P* V3 S9 `* S% N7 ?
    \A 全文开头 \z全文结尾位置 ' U, a0 i% j% h: T
    \Z 无须开启 m 多行模式 就可以匹配行尾和全文结尾/ x  g" {) F  }7 [
    \R 默认就能代替各种换行符,比\n 灵活出问题少,各种系统搞出来的文本的换行符很复杂,最常见的也有 \r \n \r\n这三种可能/ N, U+ }+ l' t3 x" |& W" n( g6 [

    ! _2 E# O( f+ V6 @\K 作用类似于逆向回顾,用于前面是某某某一些字符,比如: a\Kbc 能匹配到bc但是bc前面必须有个a
    8 |. j0 i7 Y) U0 C# p$ O类似于 (?=a)bc
    ( L$ g) m* E1 {( x9 ^* C9 w
    % F4 O2 c/ \% o' v' D- V/ J6 T所有全角双字节字符含标点
    % J7 [, a9 r4 k" h
    1. [[:unicode:]]: |) v+ E" a/ y. |3 c; @& V+ L

    2. & \; n: x' `% Z) C; t
    3. 等同于 [^\x00-\xff]
    复制代码

    3 ]. X2 H' y" g# j% K0 @4 g6 ?, y; w6 x. s/ M7 z

    ' O+ J. {/ f" k+ G  W中日韩双字节全角字符- e' k  U# M8 w3 D. Y
    1. 含生僻字中文[\x{2E80}-\x{FE4F}]3 |: I# a; B2 }; V7 F
    2. [\x{3000}-\x{9FFF}] XeCJK 中日韩
      ( S2 ~& d) |# X' E, t8 \1 O( P
    3. // 汉字范围 [\x0391-\xffe5]
    复制代码

    . i7 a6 p- E& v( d* [
    2 E. f1 c7 v# j  O7 J中文标点
    " K# G* n3 o8 T3 I, x% x$ O$ g* a
    1. [\x{3000}-\x{301e}\x{fe10}-\x{fe19}\x{fe30}-\x{fe44}\x{fe50}-\x{fe6b}\x{ff01}-\x{ffee}]
      9 l0 K7 c5 }! F% t
    2. [中文标点符号unicode码 - CSDN博客](https://blog.csdn.net/miyunhong/article/details/43528897)
    复制代码

    5 F3 Y8 @5 I# u8 f' a
    0 f. z% a! N3 G7 N英文标点
    0 h9 l2 s  F3 `; Z
    1. [[:punct:]]9 f9 B& G% h6 A, Y! G' g
    2. \p{Punct}
    复制代码

    ' c' x! x+ a2 g: U1 r8 x5 V' I$ @. ~# U( L
    1. \p{L} 等于 [a-z]
      / w8 k; J' @' A& L/ i
    2. \p{U} 等于[A-Z]
    复制代码

    / j- g( X7 A; Q% M) l" `: ~) c: V' M% |$ j1 K( f
    匹配某些特定图片img标签,
    / _! Y! e% `) X3 N1. 允许src有时候不紧跟在 <img 后面
    # r% ~: l9 h( q1 ^& m- B7 g2. src= 后面可能英文或中文引号,如果可能没有引号还得改为 ['"]?
    8 I6 C" }8 k; ]; K9 u$ m
    1. <img[^>]+src=['"]img/spkr_[^>]+>
    复制代码

    2 }0 g/ r3 c, @/ j# t2 K4 ~- k8 T3 R0 W* g* V- E$ I5 Z0 p, p
    双引号的问题
    ) `3 u% n: v/ g; R+ [多数时候正则中的双引号是个需要特别处理的,比如在一些脚本中,需要连续2个 "" 来代表 一个 "6 N; E% I  k7 o6 d
    只是在一些编辑器中好像又不需要特别处理& t5 M6 M; I- r9 d) {  U$ a7 N

    评分

    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-27 04:06 , Processed in 0.053047 second(s), 10 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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