代码之家  ›  专栏  ›  技术社区  ›  Marco Luzzara

懒惰量词与前瞻

  •  6
  • Marco Luzzara  · 技术社区  · 7 年前

    我正在开发一个正则表达式,用于验证C#中的URL。现在,我需要的正则表达式不能与其他正则表达式匹配 http:// 但是url中的第一个。这是我第一次尝试:

    (https?:\/\/.+?)\/(.+?)(?!https?:\/\/)
    

    (?!https?:\/\/) ). 以这个输入字符串为例:

    http://test.test/notwork.http://test
    

    这是我的第一个疑问: 为什么捕获组 (.+?) 火柴 notwork.http://test this 找到了一个解决方案,即使我不确定这是最好的,因为它说

    回火点 。这是我的下一次尝试:

    (https?:\/\/.+?)\/((?:(?!https?:\/\/).)*)
    

    现在:这个正则表达式正在工作,但不是我想要的方式。

    顺便说一句,我想我还没有完全理解新正则表达式在做什么: . . 它似乎匹配url,直到找到第二个http之前的倒数第二个字符。回到修正后的正则表达式,我的假设是,负前瞻实际上是试图检查 . 已经被正则表达式读取了,对吗?

    其他解决方案也被广泛接受,但我首先更愿意理解这一点。非常感谢。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Wiktor Stribiżew Cristian Lupascu    7 年前

    您寻求的解决方案是

    (?>https?://\S+?/(?:(?!https?://).)*)(?!https?://)
    

    请参阅 regex demo

    细节

    • (?>https?://\S+?/(?:(?!https?://).)*)
      • https?:// - http:// https://
      • \S+? -任何1个或更多非空白字符,尽可能少,直到第一个。。。
      • / /
      • (?:(?!https?://).)* -不启动序列的零个或多个字符(尽可能多) http:// https://
    • (?!https?://) -如果有,则消极展望会使比赛失败 http://

    这个 (https?:\/\/.+?)\/(.+?)(?!https?:\/\/) 不起作用,因为 .+? 图案匹配 懒散地 ,即它获取找到的第一个字符,然后让后续子模式匹配。随后的子模式是一个负loolahead,只有在没有匹配的情况下才会失败 https:// n 在里面 http://test.test/notwork.http://test n

    调和贪婪令牌解决方案已经讨论了很多。关于将展望放在何处的确切疑问,请参见 this answer