我正在研究用于在C#中验证URL的正则表达式。现在,我需要的正则表达式必须与其他http://
不匹配,而是与url中的第一个匹配。这是我的第一次尝试:
(https?:\/\/.+?)\/(.+?)(?!https?:\/\/)
但是这个正则表达式不起作用(甚至删除(?!https?:\/\/)
)。以此输入字符串为例:
http://test.test/notwork.http://test
以下是我的第一个疑问:为什么捕获组(.+?)
不匹配notwork.http://test
?懒惰量词应该尽可能少匹配,但为什么不到最后?在这种情况下,我当然错过了一些东西(首先我认为它可能与回溯相关,但我不认为是这种情况),所以我读了this并找到了解决方案,即使我不确定是最好的,因为它说
这项技术没有优于懒惰的点星
无论如何,该解决方案是淬火点。这是我的下一次尝试:
(https?:\/\/.+?)\/((?:(?!https?:\/\/).)*)
现在:这个正则表达式正在运行但不是我想要的方式。 仅在网址有效时才需要匹配。
顺便说一句,我认为我还没有完全理解新正则表达式在做什么:为什么负向前瞻停留在.
之前而不是之后呢?
所以我尝试在.
之后移动它,它似乎与url匹配,直到它在第二个http之前找到倒数第二个字符。回到正确的正则表达式,我的假设是,负向前瞻实际上试图检查正则表达式已经读过.
后的内容,这是对吗?
其他解决方案已被广泛接受,但我首先更愿意理解这一点。谢谢。