掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

楼主: jonah_w

[求助] 正则表达式请教

[复制链接]
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-25 21:50:38 | 显示全部楼层
    VimVim 发表于 2018-12-25 17:54+ F) G) Y! t: D6 ]5 J
    给你两个解决方案,均已测试通过!

    & r  P# ]3 c) W因为图片和文档里说的要复制的内容好像不一致,两个都试了下:
    " G! H6 K5 k6 P/ |+ u. g第一种方案先通过 :let @a = '$2h"tyi"vit:s/\~^Rt/g^M/<d:entry^M':2 Z7 u' \2 E7 ?! R7 M: H
    复制进寄存器a 回车报错:invalid expression '$2h"tyi"vit:s/\~^Rt/g^M/<d:entry^M'8 {. e& d2 ^7 [4 x
    换成let @a = '$2h"tyi"vit:s/\~/t/g /<d:entry' 没有报错。然后继续运行4@a,结果报错no range allowed$2h"tyi"vit:s/\~/t/g /<d:entry
    + O  ?  ~$ n) m5 _
    $ c7 _: g1 V! M! c' w7 N0 @6 Z& f/ u第二种方案,同样输入:let @b = "vatgJn" 没报错。9 V" n- j0 r0 A& l
    再执行4@b 报错 Not an editor command: vatgJn
    # y7 F- ]4 o0 Y6 I1 g- ~, X" D8 [; q
    不知道是不是我操作的问题。) f6 J# F) _8 w9 f. u2 D" `3 e4 H
    对了,我在Mac电脑上操作的。用的MacVim软件
    4 ?+ \' g, w5 h# U8 m( W5 n
    " Y; I0 ^; L  W" u
  • TA的每日心情

    2025-7-22 06:07
  • 签到天数: 391 天

    [LV.9]以坛为家II

    发表于 2018-12-25 22:20:28 | 显示全部楼层
    正则应该是可以做的,多用几个子单元应该就可以,从第一行的title关键字后取出单词,在/d之前的字段全部贪婪匹配~,理论上是可以执行下去的
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-25 22:24:57 | 显示全部楼层
    thresh 发表于 2018-12-25 22:203 L, T( L# X/ C/ g  A6 i
    正则应该是可以做的,多用几个子单元应该就可以,从第一行的title关键字后取出单词,在/d之前的字段全部贪 ...
    1 d; G0 j; g' S; U- i8 z
    贪婪匹配就全乱了… title跟~对不上了…
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    发表于 2018-12-25 22:56:24 | 显示全部楼层
    本帖最后由 VimVim 于 2018-12-25 23:04 编辑 3 B- ~3 o5 E: n4 }. ^( r
    jonah_w 发表于 2018-12-25 21:50
    / @( m4 ?1 W6 i4 V6 p4 A因为图片和文档里说的要复制的内容好像不一致,两个都试了下:
    / ]+ S- P( r. S! R* k第一种方案先通过 :let @a = '$2h"tyi"vit ...
    9 D) j( F$ Q" e- W, v
    之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看到截图中的^R并不是常规的字符,而是在宏命令中的Ctrl+R
    % N$ g2 Q3 X; B# W. O! W1 m1 X/ ~1 ~+ Q. y9 v2 ~+ q. O
    同时看你的截图跟我的截图不同,上述特殊字符在你的截图中看不见,可能是mac或vimrc配置的编码不同造成,你自己用qa录制出符合你系统的特殊字符,然后用"ap粘贴出来这些特殊字符,照我的截图补全即可。
    ; B3 s+ a* u+ T& Q  t6 X0 f" F0 Q3 G3 N
    你只能通过yank命令来实现准确复制特殊字符,不要用let之类,如下两个步骤可实现复制:) T6 J6 }% \) s5 d$ ]- [, N
    1、先把光标移到第一个字符
    $ M! A* t" v9 v) v$ M2、"ay$
    ) E5 h: @6 ?$ n! P3 }! p9 l
    ) B% n4 L; p; x! g" r% |( ^+ A& K$ Y无论如何,这是我觉得众多方法中最简洁的,而且不破坏原词典文件的排版格式。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 00:04:31 | 显示全部楼层
    VimVim 发表于 2018-12-25 22:56* s! ^1 l9 V: w
    之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看 ...

    0 c: D; y0 A# f4 k% N' A% ~  @是正则的宏处理吗? 可不可以直接说下正则的思路,然后我试试在其他编辑器写出来,对vim尤其是宏这块完全陌生… 不知从何入手  k7 K7 B& c5 ^# g, M+ _5 w% M
    - z1 K+ |* J; J3 i
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 00:18:13 | 显示全部楼层
    VimVim 发表于 2018-12-25 22:56
    ) a' F: c, l, W+ D  b+ e之所以又是截图,又是给附件,是因为:你看到截图中的^M并不是常规的字符,而是在宏命令中的回车键;你看 ...
    ! u- l+ |; M# [* l! t/ ]( D
    另外 按999@a 以后进入了visual模式 是不是有问题
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 00:27:32 | 显示全部楼层
    VimVim 发表于 2018-12-25 17:54
    , m2 z+ F, B3 U. m' o2 L5 M给你两个解决方案,均已测试通过!
    0 m2 {; h: d! [, K( t7 [
    是在normal模式下输入 999@a 吗 好像没什么反应
  • TA的每日心情
    开心
    2019-8-21 08:44
  • 签到天数: 163 天

    [LV.7]常住居民III

    发表于 2018-12-26 01:57:54 | 显示全部楼层
    本帖最后由 mikeee 于 2018-12-26 02:20 编辑
    9 F& Z" F  b* _1 U0 c- \! J' i
    - x8 k# ?3 K* M+ t
    1. (?<=<d:entry)([\s\S]*?title=")([^"]+)([\w\W]*)(~)([\s\S]*?)(?=</d:entry)
    复制代码

      E7 F$ Y8 a/ k4 p换成
    1. \1\2\3\2\5
    复制代码
    0 H& `# d* U/ S( i3 {
    https://regex101.com/r/iWAJTc/1/- v/ `/ M% F9 i$ }
    1 z% V" C$ i5 H/ C5 P  ^) i* Q
    我也凑个热闹……貌似可以,不过一次只能换掉一个。多个 ~ 就要点击多次。
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    发表于 2018-12-26 06:37:07 | 显示全部楼层
    本帖最后由 VimVim 于 2018-12-26 11:59 编辑 - K' x. h, }, q' l" R
    jonah_w 发表于 2018-12-26 00:04  ]4 O9 e6 Y+ y- r/ U/ k0 p# x
    是正则的宏处理吗? 可不可以直接说下正则的思路,然后我试试在其他编辑器写出来,对vim尤其是宏这块完全 ...

    2 ~6 t" z4 w+ K1、正则的思路二楼已经说的很清楚了,这里再补充一点详细信息:! |9 x' d0 y  X* Z% T( r( K& }

    1 L( j  U2 |- d9 K) S, O0 R) S, }9 K2 S
    我只是照这个思路根据你的词典结构具体实现,并采用vim的替换功能,以及宏命令重复运行该替换操作。
    + z" }! Q/ w/ Q- ^
    6 p5 d4 X$ x6 Y: a, m8 V5 [2、你只要:help usr_10即可获得关于本解决方案所需要的Vim基础知识6 w, A2 a9 n- {- C- H( |$ w; f8 O

    * Z" {& q3 B8 f5 A5 C: O, P3、补充方案一的具体思路:
    4 ^/ |8 J, U" y6 e  W0 ?$2h:定位光标到词条定义中
      x' f+ h" o( D* c* A7 K"tyi":将词条复制进寄存器t(寓意title). z% R& J, M0 r) q- u* A+ b
    vit:选中当前位置所在标签所包围的内容
    + p/ V' x% k) I  {% B, w:s/\~/^Rt/g:在上述选区范围内进行搜索替换,将所有的~替换为寄存器t中的title内容(其中^R是指Ctrl+r,并非简单字符)5 o' G- w0 j  ?
    /<d:entry:搜索定位到下一个词条起始位置
    1 @+ [8 Y/ o' J% J( U& A! }最后将上述指令放入寄存器中,并用宏命令@重复执行该寄存器的所有指令。
    : @( ?3 ~* v5 y
    + B$ h" ~' u8 [- C! Q% l  K8 N# S' X" I& {" B# N; ^

    # W$ ]2 N# a( c  `0 w: F) c( i
    ' H5 f5 w$ v; {1 [+ [  X" O" r$ s

    0 n& W7 |- ]9 c9 z, S1 i9 S: |

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?免费注册

    x
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    发表于 2018-12-26 08:41:09 | 显示全部楼层
    VimVim 发表于 2018-12-26 06:379 q5 w& ~3 R, j: `. A3 c( c# B
    1、正则的思路二楼已经说的很清楚了。我只是照这个思路根据你的词典结构具体实现,并采用vim的替换功能, ...
    ! Y, V8 p0 @9 I' L) f! ^9 v
    两个方案的实施视频如附,即使不会用看看也过瘾:
    ! J! Z0 m; O# A, T

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?免费注册

    x
  • TA的每日心情
    无聊
    2019-1-1 20:10
  • 签到天数: 31 天

    [LV.5]常住居民I

    发表于 2018-12-26 10:02:26 | 显示全部楼层
    这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml 库。
    ! e& E+ R3 S; ~

    1. 9 e$ e: E! F2 d+ R# n
    2. #!/usr/bin/env python2
      / Y  ^. s# _2 b* `  M% }/ B
    3. # -*- coding: utf-8 -*-$ c/ [# O- {8 u  N/ a
    4. """+ U1 h3 l) r( H; e" w6 {3 q+ S' u! Z
    5. File: replace_tilde_with_title.py3 @& [2 {  E& k% w+ W# p: \
    6. Author: zzhirong
      8 S/ B1 M3 X( j$ D
    7. Email: [email protected]
      2 t  F, v# n0 @1 `5 A4 I
    8. Description: 替换 span 下的 ~ 为 d:entry 的 d:title 属性
      , }* J5 e& @7 {8 J0 @' }0 ]  o
    9. """* U# L' @6 n5 n1 \& M$ m
    10. " h+ r- P2 P- G% s" q' x8 {
    11. from lxml import etree
      / o- Y5 i7 O* z! `: s( T9 N" W5 ^

    12. 5 I7 B& j: F0 U+ ]( E
    13. s = """<?xml version="1.0" encoding="UTF-8"?>
      7 E0 D5 |; z$ N% d+ |
    14. <d:dictionary xmlns="http://www.w3.org/1999/xml" xmlns:d="http://www.apple.com/DTDs/DictionaryService-1.0.rng">
      3 G6 N# q' D  q! y. F0 U
    15. <d:entry id="_38ja" d:title="xxx"># O( s' }. }: F9 E6 j+ V& y
    16. <d:index d:value="steal" d:title="steal"/><span class="hw">steal</span><br/>
      " E" n2 C* F: \  j
    17. <span class="ex">~ a visit <span class="tag1">(an interview)</span> </span><span class="ex_c">测试<span class="tag1">(测试)</span></span>
      / A; g4 k* x' s- Z' W" Q( g: ^
    18. <span class="ex">~ a kiss </span><span class="ex_c">测试</span>' j, M/ l5 R6 l9 f  h
    19. <span class="ex">~ rides on the train </span><span class="ex_c">测试</span>4 X# e0 F9 |. t' `$ Y7 k
    20. </d:entry>$ v8 i9 ^+ |: {3 z( ]
    21. </d:dictionary>$ r9 f+ e$ E8 {9 q/ f% R
    22. """
      + _* X. |  b; G' Z

    23. 1 k& S! @1 W: P) ^
    24. xml = etree.XML(s)
      % C1 W0 x7 I9 [
    25. D_NS = xml.nsmap["d"]
      $ y5 z8 ^& o# ]$ i$ X/ d6 t( n( T9 ~% ]
    26. XML_NS = xml.nsmap[None]
      ) y# j( {/ Z, b& w/ o1 D
    27. + i! L# I2 z: @2 X: ]
    28. for entry in xml.xpath("//d:entry", namespaces={"d": xml.nsmap["d"]}):7 w) q1 p* f; K3 O0 a+ r4 E
    29.     title = entry.get("{%s}title" % D_NS, "")/ ^8 b1 c) N7 B! W
    30.     for span in entry.iterfind("./{%s}span" % XML_NS):3 |4 r' V% ?( _! B
    31.         span.text = span.text.replace("~", title)$ |) D5 I/ f5 r& S6 n; s3 c
    32. print(etree.tostring(xml))
      # s6 k0 [4 f7 d$ M8 u: g& r8 t
    复制代码
    2 [) F% {: T" N

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?免费注册

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

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:25:34 | 显示全部楼层
    VimVim 发表于 2018-12-26 06:37
    0 {) H& `2 G; \4 Y5 ]7 [) d1、正则的思路二楼已经说的很清楚了,这里再补充一点详细信息:
    3 f5 a  Q4 _4 E. j9 Y$ F8 m
    好,有时间好好研究下。非常感谢,一下涨了不少知识。3 b+ \* j& a# k- Y, e+ `; X
    / ^7 d, W$ d5 z  L3 @; U
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:27:15 | 显示全部楼层
    zzhirong 发表于 2018-12-26 10:02/ b1 E, p( j+ q- X
    这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml  ...
    : v% E' v; {3 f" w
    前几天我在一个技术群里问正则的问题,里面一个大佬一直给我推荐xpath,说正则那是人用的东西么。哈哈哈
    9 b% g  V- H8 ~4 n找时间一定得研究下这东西,哈哈哈哈。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:27:52 | 显示全部楼层
    zzhirong 发表于 2018-12-26 10:02
    - q5 i9 ~) I! c- z1 Y  I/ p% g这问题用 XPath 可以不用这么烧脑,用正则表达式则是把简单事情复杂化了,附 python 程序实现,依赖 lxml  ...
    ; D) Q. W7 |0 f* I
    感谢分享代码哈。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-26 18:28:31 | 显示全部楼层
    VimVim 发表于 2018-12-26 08:41/ u" V& L) J/ S9 z4 O9 B$ ?
    两个方案的实施视频如附,即使不会用看看也过瘾:
    7 ]6 t+ _: J% Q! R
    下下来看看
  • TA的每日心情
    无聊
    2022-9-25 21:09
  • 签到天数: 1136 天

    [LV.10]以坛为家III

    发表于 2018-12-26 22:03:28 | 显示全部楼层
    孤影 发表于 2018-12-25 20:11
    ( _5 P# @1 U; x+ q5 C: @5 u软件项目文件丢失了,不过你可以通过编辑器把全角的~替换成半角的~

    : H9 J7 }4 I0 v0 h  x3 w  a有试过这方法,但是记得好像又有新的问题出现,我再找时间试试。谢谢。
  • TA的每日心情

    2025-7-22 06:07
  • 签到天数: 391 天

    [LV.9]以坛为家II

    发表于 2018-12-26 22:34:41 | 显示全部楼层
    jonah_w 发表于 2018-12-25 22:24
    : e0 u  k$ R8 i贪婪匹配就全乱了… title跟~对不上了…

    , Q( W. c  \& r) Q$ G6 |- @1 J不贪婪怎么匹配所有的~??要不你查一下~的unicode代码,直接转义匹配,看看会不会出错
  • TA的每日心情

    2025-7-22 06:07
  • 签到天数: 391 天

    [LV.9]以坛为家II

    发表于 2018-12-26 22:36:12 | 显示全部楼层
    jonah_w 发表于 2018-12-26 18:27
    ; @" O: w* f5 a9 z8 s- ^0 o% Z前几天我在一个技术群里问正则的问题,里面一个大佬一直给我推荐xpath,说正则那是人用的东西么。哈哈哈3 p+ z. h* n. v0 n: \
    ...
    $ z# ~3 V; D( z9 \: {- ^$ g' r. v
    正则还算友好,lisp才不是人用的
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-27 15:03:45 | 显示全部楼层
    leescott 发表于 2018-12-25 20:03
    # |- y+ u0 n8 q8 d$ h' Y这种情况下,我喜欢用cnbook。
    * h4 P) G1 M* f- a( I复制原件到新建文本里面,替换\n为空。再把

    ! a9 _5 ^  g( \9 e; I2 ?; i我在Sublime编辑器里用正则替换,一共需要替换18万多个地方… 结果直接卡死… 如图。想把正则写在sed命令里,但不知道怎么写。求指教。
    " a! Q: `+ k' V7 ]$ ]' W) H+ q: I, H7 c$ j5 a$ N- ]' b
    界面操作在量大的时候可用性指数下降… 5 }/ l) \7 A9 c& i
    ' a0 y% W/ Q/ n( r% p; q
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-28 18:08:57 | 显示全部楼层
    写出了连编辑器都害怕的正则 4 N! P8 v2 @9 p$ ]& n# i! L, K; I* p1 ^

    . h# u6 F' l4 l" _  k- A+ n" s- |/ X3 I$ y7 {5 \3 e1 M: {8 H* [
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 21:36:08 | 显示全部楼层
    孤影 发表于 2018-12-25 19:467 f0 V, A. {! Z, M  W; J. K
    我的软件不行吗?
    # f9 O" N5 K2 q" v
    刚试了下孤影大大的小工具,好像不行,没有替换成功,虽然~没有了。 丢失了~前面的单词。
  • TA的每日心情
    开心
    前天 17:11
  • 签到天数: 808 天

    [LV.10]以坛为家III

    发表于 2018-12-30 22:09:10 | 显示全部楼层
    jonah_w 发表于 2018-12-30 12:36; F9 ~! ^: j; Y( u9 ^
    刚试了下孤影大大的小工具,好像不行,没有替换成功,虽然~没有了。 丢失了~前面的单词。 ...

    9 e# k: M8 p! ?+ s  W" i发个测试文件看看
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 22:16:57 | 显示全部楼层
    孤影 发表于 2018-12-30 22:097 m" [" V2 ^0 f: I  f2 ^
    发个测试文件看看
    " M' ~0 h/ ?8 c- I' a

    & \2 P7 w6 u3 I* Y
    7 B3 Y$ l( F9 g3 F" [7 h0 x' M7 P3 \; `7 @/ V, B9 ^

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?免费注册

    x
  • TA的每日心情
    开心
    前天 17:11
  • 签到天数: 808 天

    [LV.10]以坛为家III

    发表于 2018-12-30 22:22:54 | 显示全部楼层

    & S/ n8 \6 f3 ]% X4 v+ E老哥你这是什么东西?我的那个程序针对的是mdx源文件
    + Z+ h4 v) Z7 W+ X. N- J词头
    , S, F# ^, l5 n。。。。。。。。。。。。。。。。。。。。* I# X7 ]9 ?6 @6 e8 }
    </>8 j. J& F* ~; Y% p" M
    ! F2 y% @" m$ A1 }. Q' e1 `
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

     楼主| 发表于 2018-12-30 22:31:31 | 显示全部楼层
    孤影 发表于 2018-12-30 22:22, G! `& S' I) R' o
    老哥你这是什么东西?我的那个程序针对的是mdx源文件# h* T- ^& x* k3 Q/ U- @
    词头4 }* [% n! i3 ?1 S
    。。。。。。。。。。。。。。。。。。。。
    $ g% g, H5 F. q

      X6 J9 |& q: v8 q+ d/ f5 ~% D* f) u& _$ r2 e% z% e
    好吧。这个是Mac词典源文件…
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

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

    GMT+8, 2026-8-8 00:15 , Processed in 0.021573 second(s), 16 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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