查看: 995|回复: 16
打印 上一主题 下一主题

[求助] 請賜教:正則語法

[复制链接]
  • TA的每日心情
    开心
    2018-8-8 03:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    254

    主题

    4264

    回帖

    7万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    79050

    小蜜蜂章笑傲江湖章灌水大神章QQ 章

    QQ
    跳转到指定楼层
    1
    发表于 2019-3-15 10:32:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 喬治兄 于 2019-3-15 10:46 编辑

    此兩個正則語法問題困擾小弟很久因正則實在難以下嚥,特請同好指點迷津不吝指導
    在此感謝大德

    問題 1. 想處理每個詞條若內容詞條相同則前後以 ①詞條② 包覆
    abc
    sdf , jhdj , hjdk , abc , def
    </>

    想處理成

    abc
    sdf , jhdj , hjdk , abc , def
    </>

    問題 2. 想處理每個詞條若內容有~則以詞條替換
    host
    a ~ of
    ~s of
    a ~ of friend
    </>

    想處理成
    host
    a host of
    hosts of
    a host of friend
    </>


    本帖被以下淘专辑推荐:

    该用户从未签到

    9

    主题

    228

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    11443
    推荐
    发表于 2019-3-15 15:55:14 | 只看该作者
    本帖最后由 jeanleem6 于 2019-3-15 15:57 编辑
    喬治兄 发表于 2019-3-15 15:31
    jeanleem6 女施主請教
    如果實務上是此狀況想處理成 7 樓的圖示
    能解嗎?

    可以实现,查询起来更简单,不需要考虑单词边界和断言,如下:

    查询正则:
    1. ^([^\n]+?)\n([^\n]*?)<a ([^\n><]+?)>\1</a>([^\n]*?)\n</>
    复制代码
    替换为:
    1. \1\n\2<a \3>①\1②</a>\4\n</>
    复制代码


  • TA的每日心情
    奋斗
    2022-6-1 19:02
  • 签到天数: 377 天

    [LV.9]以坛为家II

    27

    主题

    556

    回帖

    15万

    积分

    状元

    喜欢折腾,但能力有限

    Rank: 9Rank: 9Rank: 9

    积分
    150901

    灌水大神章笑傲江湖章管理组专用章

    推荐
    发表于 2019-3-15 11:53:33 | 只看该作者
    正则理论上是可以搞定这个的,需要编辑器支持分组和反向引用。针对问题1,可以试试下面的正则,那个\n要根据你的编辑器调整,也可能是\r\n。问题2一样的思路,~分为一组,用\1替换即可。
    不过,这都是基于简单的例子来说,文件复杂的话,还得做调整
    查找:
    1. (.+)\n(.*?)(\1)(.*?)\n</>
    复制代码
    替换:
    1. \1\n\2①\3②\4\n</>
    复制代码
    下面是我的测试文本:
    替换前:
    1. ab
    2. ac,ab,as,ad,af
    3. </>

    4. ac
    5. ac,ab,as,ad,af
    6. </>
    7. as
    8. ac,ab,as,ad,af
    9. </>
    10. ad
    11. ac,ab,as,ad,af
    12. </>
    13. af
    14. ac,ab,as,ad,af
    15. </>
    16. aw
    17. ac,ab,as,ad,af
    18. </>
    复制代码
    替换后:
    1. ab
    2. ac,①ab②,as,ad,af
    3. </>

    4. ac
    5. ①ac②,ab,as,ad,af
    6. </>
    7. as
    8. ac,ab,①as②,ad,af
    9. </>
    10. ad
    11. ac,ab,as,①ad②,af
    12. </>
    13. af
    14. ac,ab,as,ad,①af②
    15. </>
    16. aw
    17. ac,ab,as,ad,af
    18. </>
    复制代码



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

    [LV.7]常住居民III

    73

    主题

    1552

    回帖

    9万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    96973

    QQ 章笑傲江湖章灌水大神章推广专家

    推荐
    发表于 2019-3-15 14:29:14 | 只看该作者
    本帖最后由 VimVim 于 2019-3-15 15:11 编辑

    关于直接用正则表达式难以解决的文本处理,我建议采用Vim,使用其“宏”的功能分步解决就容易了,比如第二个替换~的思路:

    1. 1、将</>暂更改为</mdxkey><mdxkey>
    2. 2、先微观层面处理一个keyword
    3. (1)搜索<mdxkey>,并移动到下一行keyword处
    4. (2)复制keyword到剪贴板或vim的某个寄存器
    5. (3)选中<mdxkey>和</mdxkey>范围(vim中只要用vit或vat均可),在这个范围内搜索替换所有的“~”为剪贴板或vim寄存器中的内容
    6. 3、将上述(1)-(3)步骤录制为一个宏(q+任意小写字母即可,如qk)
    7. 4、重复播放在宏即可(即@k,可以在前面加上一个大于keyword数量的数字即可对所有全文进行替换)
    8. 5、将</mdxkey><mdxkey>替换为</>
    复制代码

  • TA的每日心情
    奋斗
    2019-10-11 13:52
  • 签到天数: 142 天

    [LV.7]常住居民III

    15

    主题

    336

    回帖

    15万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    153139

    灌水大神章小蜜蜂章笑傲江湖章推广专家QQ 章

    2
    发表于 2019-3-15 10:57:40 | 只看该作者
    这两个我感觉正则就不大能解决问题了,因为一个正则表达式是针对整个文件的,而问题中涉及的与各个词条有关,每个词条都不一样。这两个问题可能需要通过编程来解决,大致思路如下:
    假设每个词目占三行。写一个循环,把第二行中每一个第一行的词头前后分别包裹 ① 和 ②(针对问题一),每一个 ~ 替换为第一行的词头(针对问题二)。
  • TA的每日心情

    2019-11-22 21:06
  • 签到天数: 133 天

    [LV.7]常住居民III

    7

    主题

    385

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    12324
    3
    发表于 2019-3-15 11:46:46 | 只看该作者
    会不会编程.
  • TA的每日心情
    开心
    2018-8-8 03:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    254

    主题

    4264

    回帖

    7万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    79050

    小蜜蜂章笑傲江湖章灌水大神章QQ 章

    QQ
    5
     楼主| 发表于 2019-3-15 13:06:26 | 只看该作者
    simonfire 发表于 2019-3-15 11:53
    正则理论上是可以搞定这个的,需要编辑器支持分组和反向引用。针对问题1,可以试试下面的正则,那个\n要根 ...

    感謝 simonfire 兄提供一個解決方案,解決了小弟多年的困擾
    Thanks Again
  • TA的每日心情
    开心
    2018-8-8 03:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    254

    主题

    4264

    回帖

    7万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    79050

    小蜜蜂章笑傲江湖章灌水大神章QQ 章

    QQ
    7
     楼主| 发表于 2019-3-15 14:32:44 | 只看该作者
    本帖最后由 喬治兄 于 2019-3-15 15:40 编辑
    simonfire 发表于 2019-3-15 11:53
    正则理论上是可以搞定这个的,需要编辑器支持分组和反向引用。针对问题1,可以试试下面的正则,那个\n要根 ...


    simonfire 兄:
    第一個問題小弟用您的方法真是解的非常漂亮......
    能否再更進一步倘若小弟的格式如附件
    稍微複雜一下的情況當如何解
    test-3.txt file 100k 在底下
    謝謝啦

    2019-03-15_143307.png (10.72 KB, 下载次数: 0)

    2019-03-15_143307.png

    2019-03-15_143440.png (13.54 KB, 下载次数: 0)

    2019-03-15_143440.png

    test-3.txt

    100.89 KB, 下载次数: 4, 下载积分: 米 -5 粒

    该用户从未签到

    9

    主题

    228

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    11443
    8
    发表于 2019-3-15 14:33:54 | 只看该作者
    本帖最后由 jeanleem6 于 2019-3-15 14:35 编辑
    simonfire 发表于 2019-3-15 11:53
    正则理论上是可以搞定这个的,需要编辑器支持分组和反向引用。针对问题1,可以试试下面的正则,那个\n要根 ...

    在你的代码上做了一点修改,主要是考虑了单词边界(\b)和多次替换的情况,比如:
    1. ab
    2. ad,fad,fefsda,abcd,ab,cd,ab
    3. </>
    复制代码
    注意:词条内容区的 abcd,还有 ab 出现了两次,不考虑单词边界的情况下 abcd 中的 ab 也会被替换,单词前后不做断言的情况下多次替换会出现一直替换第一个匹配项,得到类似 ①①ab②② 这样的结果。

    修改后的查找代码:
    1. (.+)\n(.*?)\b(?!①)(\1)(?!②)\b(.*?)\n</>
    复制代码

    替换:
    1. \1\n\2①\3②\4\n</>
    复制代码



  • TA的每日心情
    开心
    2018-8-8 03:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    254

    主题

    4264

    回帖

    7万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    79050

    小蜜蜂章笑傲江湖章灌水大神章QQ 章

    QQ
    9
     楼主| 发表于 2019-3-15 15:31:44 | 只看该作者
    本帖最后由 喬治兄 于 2019-3-15 15:46 编辑
    jeanleem6 发表于 2019-3-15 14:33
    在你的代码上做了一点修改,主要是考虑了单词边界(\b)和多次替换的情况,比如:注意:词条内容区的 abcd ...


    jeanleem6 女施主請教
    如果實務上是此狀況想處理成 7 樓的圖示
    能解嗎?
    已附上附件 test-3.txt
    Thanks Again
    aa
    <a href="entry://aa">aa</a> , <a href="entry://AAA">AAA</a> , <a href="entry://aah">aah</a> , <a href="entry://aardvark">aardvark</a> , <a href="entry://aardwolf">aardwolf</a> , <a href="entry://Aaron">Aaron</a> , <a href="entry://Aaron's rod">Aaron's rod</a>
    </>
    AAA
    <a href="entry://aa">aa</a> , <a href="entry://AAA">AAA</a> , <a href="entry://aah">aah</a> , <a href="entry://aardvark">aardvark</a> , <a href="entry://aardwolf">aardwolf</a> , <a href="entry://Aaron">Aaron</a> , <a href="entry://Aaron's rod">Aaron's rod</a>
    </>
    aah
    <a href="entry://aa">aa</a> , <a href="entry://AAA">AAA</a> , <a href="entry://aah">aah</a> , <a href="entry://aardvark">aardvark</a> , <a href="entry://aardwolf">aardwolf</a> , <a href="entry://Aaron">Aaron</a> , <a href="entry://Aaron's rod">Aaron's rod</a>
    </>
    aardvark
    <a href="entry://aa">aa</a> , <a href="entry://AAA">AAA</a> , <a href="entry://aah">aah</a> , <a href="entry://aardvark">aardvark</a> , <a href="entry://aardwolf">aardwolf</a> , <a href="entry://Aaron">Aaron</a> , <a href="entry://Aaron's rod">Aaron's rod</a>
    </>

    處理成

    aa
    <a href="entry://aa">①aa②</a> , <a href="entry://AAA">AAA</a> , <a href="entry://aah">aah</a> , <a href="entry://aardvark">aardvark</a> , <a href="entry://aardwolf">aardwolf</a> , <a href="entry://Aaron">Aaron</a> , <a href="entry://Aaron's rod">Aaron's rod</a>
    </>
    AAA
    <a href="entry://aa">aa</a> , <a href="entry://AAA">①AAA②</a> , <a href="entry://aah">aah</a> , <a href="entry://aardvark">aardvark</a> , <a href="entry://aardwolf">aardwolf</a> , <a href="entry://Aaron">Aaron</a> , <a href="entry://Aaron's rod">Aaron's rod</a>
    </>
    aah
    <a href="entry://aa">aa</a> , <a href="entry://AAA">AAA</a> , <a href="entry://aah">①aah②</a> , <a href="entry://aardvark">aardvark</a> , <a href="entry://aardwolf">aardwolf</a> , <a href="entry://Aaron">Aaron</a> , <a href="entry://Aaron's rod">Aaron's rod</a>
    </>
    aardvark
    <a href="entry://aa">aa</a> , <a href="entry://AAA">AAA</a> , <a href="entry://aah">aah</a> , <a href="entry://aardvark">①aardvark②</a> , <a href="entry://aardwolf">aardwolf</a> , <a href="entry://Aaron">Aaron</a> , <a href="entry://Aaron's rod">Aaron's rod</a>
    </>

  • TA的每日心情
    开心
    2018-8-8 03:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    254

    主题

    4264

    回帖

    7万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    79050

    小蜜蜂章笑傲江湖章灌水大神章QQ 章

    QQ
    10
     楼主| 发表于 2019-3-15 15:35:29 | 只看该作者
    VimVim 发表于 2019-3-15 14:29
    关于直接用正则表达式难以解决的文本处理,我建议采用Vim,使用其“宏”的功能分步解决就容易了,比如第二 ...

    VimVim 兄:
    哇! Vim 沒用過
    不知重何學起
  • TA的每日心情
    开心
    2018-8-8 03:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    254

    主题

    4264

    回帖

    7万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    79050

    小蜜蜂章笑傲江湖章灌水大神章QQ 章

    QQ
    12
     楼主| 发表于 2019-3-15 16:02:44 | 只看该作者
    jeanleem6 发表于 2019-3-15 15:55
    可以实现,查询起来更简单,不需要考虑单词边界和断言,如下:

    查询正则:

    感謝 jeanleem6 女施主賜教
    終於解了多年難以理解的正則
    真是太感謝啦
    Thanks Again
  • TA的每日心情
    开心
    2018-8-8 03:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    254

    主题

    4264

    回帖

    7万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    79050

    小蜜蜂章笑傲江湖章灌水大神章QQ 章

    QQ
    13
     楼主| 发表于 2019-3-15 18:47:41 | 只看该作者
    jeanleem6 发表于 2019-3-15 15:55
    可以实现,查询起来更简单,不需要考虑单词边界和断言,如下:

    查询正则:

    jeanleem6 女施主再次向您請益賜教
    真不好意思一直麻煩您
    倘若有需求想處理成
    也就是內容和詞頭一樣時全部標上
    不知是否能也能解
    謝謝您

    aa
    <a href="entry://aa">①aa②</a> , <a href="entry://AAA">①AA②A</a> , <a href="entry://aah">①aa②h</a> , <a href="entry://aardvark">①aa②rdvark</a> , <a href="entry://aardwolf">①aa②rdwolf</a> , <a href="entry://Aaron">①Aa②ron</a> , <a href="entry://Aaron's rod">①Aa②ron's rod</a>
    </>
  • TA的每日心情
    开心
    2018-8-8 03:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    254

    主题

    4264

    回帖

    7万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    79050

    小蜜蜂章笑傲江湖章灌水大神章QQ 章

    QQ
    14
     楼主| 发表于 2019-3-15 19:01:19 | 只看该作者
    本帖最后由 喬治兄 于 2019-3-15 19:12 编辑
    jeanleem6 发表于 2019-3-15 15:55
    可以实现,查询起来更简单,不需要考虑单词边界和断言,如下:

    查询正则:


    jeanleem6 女施主:
    哇!, 太強捍了剛剛試了您的正則, 太完美了.....漂亮...讚!讚!讚!
    ,一秒 work
    謝謝


  • TA的每日心情

    2019-11-22 21:06
  • 签到天数: 133 天

    [LV.7]常住居民III

    7

    主题

    385

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    12324
    15
    发表于 2019-3-15 19:57:41 | 只看该作者
    正则高手啊....
  • TA的每日心情

    2019-11-22 21:06
  • 签到天数: 133 天

    [LV.7]常住居民III

    7

    主题

    385

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    12324
    16
    发表于 2019-3-15 19:58:14 | 只看该作者
    能处理所有的单词吗?
  • TA的每日心情
    开心
    2018-8-8 03:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    254

    主题

    4264

    回帖

    7万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    79050

    小蜜蜂章笑傲江湖章灌水大神章QQ 章

    QQ
    17
     楼主| 发表于 2019-3-16 00:28:47 | 只看该作者
    anyid999 发表于 2019-3-15 19:58
    能处理所有的单词吗?

    anyid999 兄:
    是的 jeanleem6 女施主的正則能處理所有的单词