懒惰的量词和前瞻

时间:2017-08-11 13:46:12

标签: c# regex negative-lookahead

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

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

但是这个正则表达式不起作用(甚至删除(?!https?:\/\/))。以此输入字符串为例:

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

以下是我的第一个疑问:为什么捕获组(.+?)不匹配notwork.http://test ?懒惰量词应该尽可能少匹配,但为什么不到最后?在这种情况下,我当然错过了一些东西(首先我认为它可能与回溯相关,但我不认为是这种情况),所以我读了this并找到了解决方案,即使我不确定是最好的,因为它说

  

这项技术没有优于懒惰的点星

无论如何,该解决方案是淬火点。这是我的下一次尝试:

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

现在:这个正则表达式正在运行但不是我想要的方式。 仅在网址有效时才需要匹配。

顺便说一句,我认为我还没有完全理解新正则表达式在做什么:为什么负向前瞻停留在.之前而不是之后呢? 所以我尝试在.之后移动它,它似乎与url匹配,直到它在第二个http之前找到倒数第二个字符。回到正确的正则表达式,我的假设是,负向前瞻实际上试图检查正则表达式已经读过.后的内容,这是对吗?

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

0 个答案:

没有答案