查看: 839|回复: 25
打印 上一主题 下一主题

[求助] 正则表达式替换问题:如何给HTML正文斜杠加上标签

[复制链接]
  • TA的每日心情
    慵懒
    2021-9-28 14:33
  • 签到天数: 158 天

    [LV.7]常住居民III

    5

    主题

    907

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    17310

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

    跳转到指定楼层
    1
    发表于 2019-1-16 16:00:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 atauzki 于 2019-1-16 19:03 编辑

    如何将类似
    1. <script type="text/javascript"></script><span class="foo">a foo/bar/baz/...<a href="entry://localhost/vbiauedbvie0">aaa/bbb/ccc/ddd</a>ee/fff/gg</span>
    复制代码

    这类字符串替换成
    1. <script type="text/javascript"></script><span class="foo">a foo<span class="sep">/</span>bar<span class="sep">/</span>baz<span class="sep">/</span>...<a href="entry://localhost/vbiauedbvie0">aaa<span class="sep">/</span>bbb<span class="sep">/</span>ccc<span class="sep">/</span>ddd</a>ee<span class="sep">/</span>fff<span class="sep">/</span>gg</span>
    复制代码

    要替换的文本中标签可能存在url,嵌套任意,正文内容中单词数量可变。现在要求保持标签内部斜杠不变,正文里斜杠被<span class="sep">标签包围。
  • TA的每日心情
    慵懒
    2021-9-28 14:33
  • 签到天数: 158 天

    [LV.7]常住居民III

    5

    主题

    907

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    17310

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

    推荐
     楼主| 发表于 2019-1-17 10:59:38 | 只看该作者
    本帖最后由 atauzki 于 2019-1-17 13:51 编辑
    jonah_w 发表于 2019-1-16 23:32
    可能编辑器对正则的支持不尽相同,我这边是可以的。

    确实如此。安卓quickedit测试成功。这个编辑器的正则引擎就是java的自带正则库,emeditor默认用的boost
    UPADTE:(?<=>)([^<>]+?)(\/)([^<>]+?)(?=<)可以替换。转义符不能随便用。
  • TA的每日心情
    慵懒
    2019-1-23 10:04
  • 签到天数: 122 天

    [LV.7]常住居民III

    12

    主题

    641

    回帖

    3万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    39986
    推荐
    发表于 2019-1-16 18:08:21 | 只看该作者
    可以先缩小至需要替换的范围,然后在选中范围内进一步作替换。

    EmEditor里可以这么做:
    <a href="..."></a>内的斜杠
    1. 查找全部:
    1. (?<=">)([^<]*?)(?=</a>)
    复制代码
    2. 勾选仅限于选区内 (in the selection only),再将"/"替换成"<span class="sep">/</span>"


    紧接在<span class="foo">后面的斜杠
    1. 查找全部
    1. (?<=<span class="foo">)([^<]*?)(?=<)
    复制代码
    2. 勾选仅限于选区内 (in the selection only),再将"/"替换成"<span class="sep">/</span>"

    评分

    2

    查看全部评分

  • TA的每日心情
    开心
    2019-1-18 23:55
  • 签到天数: 230 天

    [LV.7]常住居民III

    72

    主题

    1027

    回帖

    11万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    117972

    QQ 章

    2
    发表于 2019-1-16 16:20:11 来自手机 | 只看该作者
    先替换标签内容,再换正文,最后把标签内容恢复回去,应该可以
  • TA的每日心情
    擦汗
    2019-12-4 09:00
  • 签到天数: 302 天

    [LV.8]以坛为家I

    0

    主题

    466

    回帖

    8655

    积分

    禁止发言

    积分
    8655
    3
    发表于 2019-1-16 16:44:34 | 只看该作者
    你敢保证所有形式都这样吗?如果是的话,不就是把“/”替换成了“<span class="sep">/</span>”吗 正常替换不就行了吗
  • TA的每日心情
    慵懒
    2021-9-28 14:33
  • 签到天数: 158 天

    [LV.7]常住居民III

    5

    主题

    907

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    17310

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

    4
     楼主| 发表于 2019-1-16 16:51:40 | 只看该作者
    dothu 发表于 2019-1-16 16:44
    你敢保证所有形式都这样吗?如果是的话,不就是把“/”替换成了“/”吗 正常替换不就行了吗 ...

    要排除掉html标签内的斜杠,以及<a href=...>的斜杠
  • TA的每日心情
    擦汗
    2019-12-4 09:00
  • 签到天数: 302 天

    [LV.8]以坛为家I

    0

    主题

    466

    回帖

    8655

    积分

    禁止发言

    积分
    8655
    5
    发表于 2019-1-16 17:15:53 | 只看该作者
    不用管标签内的斜杠,[^>]就连同斜杠一起排除了

    查找
    1. (<a href="entry://[^>]*?>\w+?)(/)(\w+?)(/)(\w+?)(/)(\w+?</a>)
    复制代码

    替换
    1. \1<span class="sep">\2</span>\3<span class="sep">\4</span>\5<span class="sep">\6</span>\7
    复制代码

  • TA的每日心情
    慵懒
    2021-9-28 14:33
  • 签到天数: 158 天

    [LV.7]常住居民III

    5

    主题

    907

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    17310

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

    6
     楼主| 发表于 2019-1-16 17:23:03 | 只看该作者
    dothu 发表于 2019-1-16 17:15
    不用管标签内的斜杠,[^>]就连同斜杠一起排除了

    查找

    如果标签内斜杠数目有变化呢
  • TA的每日心情
    擦汗
    2019-12-4 09:00
  • 签到天数: 302 天

    [LV.8]以坛为家I

    0

    主题

    466

    回帖

    8655

    积分

    禁止发言

    积分
    8655
    7
    发表于 2019-1-16 17:25:37 | 只看该作者
    atauzki 发表于 2019-1-16 17:23
    如果标签内斜杠数目有变化呢

    你是说标签内包含的aaa|bbb|ccc有变化是吧,对啊,所以刚才问你是不是严格准守这个格式啊
  • TA的每日心情
    慵懒
    2021-9-28 14:33
  • 签到天数: 158 天

    [LV.7]常住居民III

    5

    主题

    907

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    17310

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

    8
     楼主| 发表于 2019-1-16 17:43:57 | 只看该作者
    dothu 发表于 2019-1-16 17:25
    你是说标签内包含的aaa|bbb|ccc有变化是吧,对啊,所以刚才问你是不是严格准守这个格式啊 ...

    不严格遵守啊,我刚才编辑了一下1楼的问题。基本上就是最一般的情况。
  • TA的每日心情
    擦汗
    2019-12-4 09:00
  • 签到天数: 302 天

    [LV.8]以坛为家I

    0

    主题

    466

    回帖

    8655

    积分

    禁止发言

    积分
    8655
    10
    发表于 2019-1-16 18:17:20 | 只看该作者
    atauzki 发表于 2019-1-16 17:43
    不严格遵守啊,我刚才编辑了一下1楼的问题。基本上就是最一般的情况。

    你这种情况能一次匹配,但不能替换,正则没法替换计数的匹配。只能采用多次匹配替换,或者脚本。
  • TA的每日心情
    擦汗
    2019-12-4 09:00
  • 签到天数: 302 天

    [LV.8]以坛为家I

    0

    主题

    466

    回帖

    8655

    积分

    禁止发言

    积分
    8655
    11
    发表于 2019-1-16 18:20:12 | 只看该作者
    嗯,9楼方法简单,完全可行,我还没注意EmEditor有这么个功能,这软件果然是个好东西。。。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

    250

    主题

    2966

    回帖

    53万

    积分

    状元

    吃水不忘挖井人

    Rank: 9Rank: 9Rank: 9

    积分
    531111

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

    12
    发表于 2019-1-16 19:00:58 | 只看该作者
    供参考:

    1. (?<=\>)([^<>]+?)(\/)([^<>]+?)(?=<)
    复制代码


    替换为:

    1. \1<span class="sep">/</span>\3
    复制代码


    注:需多次替换
  • TA的每日心情
    奋斗
    2019-10-13 07:34
  • 签到天数: 209 天

    [LV.7]常住居民III

    73

    主题

    1552

    回帖

    9万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    96973

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

    13
    发表于 2019-1-16 19:04:45 | 只看该作者
    应该一步就可以替换到位:搜索>……<之间的/替换即可,其中>……<是指以>开头,以<结尾

    评分

    1

    查看全部评分

  • TA的每日心情
    擦汗
    2019-12-4 09:00
  • 签到天数: 302 天

    [LV.8]以坛为家I

    0

    主题

    466

    回帖

    8655

    积分

    禁止发言

    积分
    8655
    14
    发表于 2019-1-16 20:15:33 | 只看该作者
    VimVim 发表于 2019-1-16 19:04
    应该一步就可以替换到位:搜索>…………开头,以

    这个我想过,但从我经验上看是很容易误伤。其实我3楼就是这个意思... 0_0!

    点评

    3楼的方法应该会误伤诸如此类的替换吧:<a href="entry://localhost/vbiauedbvie0">  发表于 2019-1-16 20:17
  • TA的每日心情
    擦汗
    2019-12-4 09:00
  • 签到天数: 302 天

    [LV.8]以坛为家I

    0

    主题

    466

    回帖

    8655

    积分

    禁止发言

    积分
    8655
    15
    发表于 2019-1-16 20:20:18 | 只看该作者
    不,我的意思是你那个,> ... <, 当然不可能是纯的直接替换...

    该用户从未签到

    3

    主题

    235

    回帖

    5070

    积分

    会元

    Rank: 7Rank: 7Rank: 7

    积分
    5070
    16
    发表于 2019-1-16 20:24:57 | 只看该作者
    本帖最后由 dongzhi1980 于 2019-1-16 20:50 编辑

    个人认为至少需要两步:(在Emeditor环境中通过)
    1.ctrl+F弹出页面输入 >[^<].*?/.*?< 点击 选中所有,再在同一界面下点击 替换
    2.取消正则模式,点击 仅限选区内后输入 查找 / 替换为 <span class="sep">/</span> 再点击全部替换,收功。
    附件为图片,详细过程
    基本思想是:1.选中全部非标签区域内容;2.在选中的区域中替换掉全部的/。就这样



    process.zip

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

  • TA的每日心情
    慵懒
    2021-9-28 14:33
  • 签到天数: 158 天

    [LV.7]常住居民III

    5

    主题

    907

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    17310

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

    17
     楼主| 发表于 2019-1-16 20:34:37 | 只看该作者

    这个不行。最后还有残留。

    20190116203416.png (20.67 KB, 下载次数: 1)

    20190116203416.png
  • TA的每日心情
    慵懒
    2021-9-28 14:33
  • 签到天数: 158 天

    [LV.7]常住居民III

    5

    主题

    907

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    17310

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

    18
     楼主| 发表于 2019-1-16 20:37:30 | 只看该作者
    本帖最后由 atauzki 于 2019-1-16 20:55 编辑

    用这个(?=>)[^<]+?(?=<)然后全选替换。
    结果和16楼基本一样。

    该用户从未签到

    3

    主题

    235

    回帖

    5070

    积分

    会元

    Rank: 7Rank: 7Rank: 7

    积分
    5070
    19
    发表于 2019-1-16 20:44:54 | 只看该作者
    本帖最后由 dongzhi1980 于 2019-1-16 20:46 编辑

    你看懂16楼的方法了吗,再下载图片看看详细过程吧,我是调试通过了才贴出方法的
  • TA的每日心情
    慵懒
    2021-9-28 14:33
  • 签到天数: 158 天

    [LV.7]常住居民III

    5

    主题

    907

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    17310

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

    20
     楼主| 发表于 2019-1-16 20:54:25 | 只看该作者
    本帖最后由 atauzki 于 2019-1-16 21:01 编辑
    dongzhi1980 发表于 2019-1-16 20:44
    你看懂16楼的方法了吗,再下载图片看看详细过程吧,我是调试通过了才贴出方法的
    ...

    测试过了。详细过程不一样,我还是明白的。第二步我就不贴了。

    Scrshot.zip

    34.03 KB, 下载次数: 9, 下载积分: 米 -5 粒

    该用户从未签到

    3

    主题

    235

    回帖

    5070

    积分

    会元

    Rank: 7Rank: 7Rank: 7

    积分
    5070
    21
    发表于 2019-1-16 21:03:02 | 只看该作者
    本帖最后由 dongzhi1980 于 2019-1-17 10:31 编辑
    atauzki 发表于 2019-1-16 20:54
    测试过了。详细过程不一样,我还是明白的。

    仔细想一想,第一步用正则可以成功选中非标签区域的所有内容(包括“/”),然后第二步用正常方法(非正则)对选中的内容中的“/”进行替换,怎么能不成功。

    看了你的图片,可能是我没说清楚,第一步的目的是选中全部非标签区域,你做对了,然后选中目标后点击 “同一对话框”中的替换(就在那对话框下面),就会自动切换到“替换”对话框,然后在替换对话框中按我的图片2中的进行操作就行了(注意“取消正则”并点击“仅选中的内容”这两项)。
    下面这个附件中是我录制的视频操作过程,可以参考一下(EmEditor Version 18.4.0)


    replace process.7z

    1.26 MB, 下载次数: 3, 下载积分: 米 -5 粒

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

    [LV.6]常住居民II

    250

    主题

    2966

    回帖

    53万

    积分

    状元

    吃水不忘挖井人

    Rank: 9Rank: 9Rank: 9

    积分
    531111

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

    22
    发表于 2019-1-16 23:32:58 | 只看该作者
    atauzki 发表于 2019-1-16 20:34
    这个不行。最后还有残留。

    可能编辑器对正则的支持不尽相同,我这边是可以的。
  • TA的每日心情
    擦汗
    2019-12-4 09:00
  • 签到天数: 302 天

    [LV.8]以坛为家I

    0

    主题

    466

    回帖

    8655

    积分

    禁止发言

    积分
    8655
    23
    发表于 2019-1-17 10:24:34 | 只看该作者
    哦去,这个问题还没结束啊,建议按9楼的方法,就是借助EmEditor正则取出一部分再正则替换一次,最能减少误伤几率,还不用手动写脚本。
  • TA的每日心情
    开心
    2019-8-21 08:44
  • 签到天数: 163 天

    [LV.7]常住居民III

    17

    主题

    393

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    14980
    25
    发表于 2019-1-17 12:28:02 | 只看该作者
    >[^<]+< 不是可以完美定位?

    https://regex101.com/r/MAw0Wr/1/