V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
livc
V2EX  ›  程序员

求助一个正则表达式的问题

  •  
  •   livc ·
    livc · 2019-04-21 21:53:11 +08:00 · 1836 次点击
    这是一个创建于 2068 天前的主题,其中的信息可能已经有所发展或是发生改变。

    输入是 html 文件,但所有的<和> 都是 &lt;&gt;,希望把 &lt;&gt; 替换成<和>

    源码只有一句替换的语句,暴露的接口就是一次 replace 操作的 RegExp Pattern,RegExp Options,RegExp Replacement 三个字段,也就是只能填写这三个字段,不能替换两次那样,需要一次完成,源码是 ruby 的 regexp。

    不知道我有没有说清楚,有思路的大佬可以帮忙看看,谢谢

    8 条回复    2019-04-21 23:05:54 +08:00
    geelaw
        1
    geelaw  
       2019-04-21 22:14:18 +08:00
    假设你的输入是 well-structured,那么在第一个能被理解为小于号的 &lt; 之前必须有一个 <,最后一个能被理解为大于号的 &gt; 之后必须有一个 >,于是你可以考虑如下正则表达式、选项和替换项

    /(?<=(<).*?)&lt;|&gt;(?=.*?(>))/m

    MULTILINE

    \1\2

    当然,想要在实际中用这种方法达成目的的人多半是有毛病的。
    geelaw
        2
    geelaw  
       2019-04-21 22:20:40 +08:00
    Ugh, 看了一下 Ruby 的文档,你可以给 replacement 设置一个函数,这样的话是平凡的,而且可以处理完全没有 <> 的情况。(我理解的题目是说想把里面本来就该 escape 的东西替换成 <>,而不是整个文件都 escape 过了;后面这种情况只能用传入非字符串的方式解决。)
    livc
        3
    livc  
    OP
       2019-04-21 22:32:23 +08:00
    @geelaw #1 并没有看懂。。为什么第一个小于号前面还有小于号?
    SuperMonster009
        4
    SuperMonster009  
       2019-04-21 22:40:43 +08:00 via Android   ❤️ 1
    str.replace(/(?:&lt;)(.*?)(?:&gt;)/g, "<$1>")

    但这样会误伤
    geelaw
        5
    geelaw  
       2019-04-21 22:49:57 +08:00
    @livc #3 因为我认为你想要把 <html>&lt;&gt;</html> 替换成 <html><></html>
    lzhd24
        6
    lzhd24  
       2019-04-21 22:56:37 +08:00 via Android
    问题在于是不是需要把所有的 &lt; 和 &gt; 都替换成<和>,如果是 4 楼就是答案。
    livc
        7
    livc  
    OP
       2019-04-21 22:58:19 +08:00
    @SuperMonster009 #4 这个可以的,谢谢!

    @geelaw #5 哦哦明白啦,其实 html 前后的<>也是&lt;&gt;,我先用四楼的方法。anyway 谢谢大佬。

    @lzhd24 #6 对的,谢谢。
    geelaw
        8
    geelaw  
       2019-04-21 23:05:54 +08:00
    @livc #7 明白你的需求了,然而只有在特定情况下 #4 的方法才是正确的,特别来说你需要假设没有注释。如果假设所有的 & 都被替换成了 &amp;(包括注释里面的)且原先没有不安全的 <>,那么安全的做法是

    /&lt;(--.*?--|-[^-].*?|[^-].*?|)&gt;/ 替换为 <\1>

    其中 . 选择任意字符的含义。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1950 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:15 · PVG 00:15 · LAX 08:15 · JFK 11:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.