我正在为验证C#的URL编写正则表达式。现在,我需要的正则表达式不能匹配其他的
但是这个正则表达式不起作用(即使删除
这是我的第一个疑问:为什么捕获组
现在,这个正则表达式可以工作,但不是我想要的方式。我需要一个只有在URL有效时才匹配的结果。
顺便说一下,我认为我还没有完全理解新的正则表达式的作用:为什么负向先行断言留在点之前而不是之后?所以我试着把它移到点之后,看起来它匹配URL直到找到第二个http之前的倒数第二个字符。回到更正的正则表达式,我的假设是负向先行断言实际上正在尝试检查正则表达式已经读取的点后面的内容,这样对吗?
其他解决方案也很好接受,但我首选理解这个。谢谢。
http://
,但必须匹配URL中第一个http://
。这是我第一次尝试的正则表达式:(https?:\/\/.+?)\/(.+?)(?!https?:\/\/)
但是这个正则表达式不起作用(即使删除
(?!https?:\/\/)
)。以这个输入字符串为例:http://test.test/notwork.http://test
这是我的第一个疑问:为什么捕获组
(.+?)
不能匹配notwork.http://test
?懒惰量词应该尽可能少地匹配,但为什么不到结尾呢?在这种情况下,我肯定漏掉了什么(起初,我认为它可能与回溯有关,但我认为这不是问题),所以我阅读了这篇文章,找到了一个解决方案,即使我不确定这是否是最好的解决方案,因为它说:
这种技术在懒惰点星上没有任何优势
无论如何,那个解决方案是温和的点号。这是我的下一个尝试:
(https?:\/\/.+?)\/((?:(?!https?:\/\/).)*)
现在,这个正则表达式可以工作,但不是我想要的方式。我需要一个只有在URL有效时才匹配的结果。
顺便说一下,我认为我还没有完全理解新的正则表达式的作用:为什么负向先行断言留在点之前而不是之后?所以我试着把它移到点之后,看起来它匹配URL直到找到第二个http之前的倒数第二个字符。回到更正的正则表达式,我的假设是负向先行断言实际上正在尝试检查正则表达式已经读取的点后面的内容,这样对吗?
其他解决方案也很好接受,但我首选理解这个。谢谢。
$
作为替代方案((.*?)(?=https?:\/\/|$)
)。.+?
匹配1个字符,并且不必匹配更多,因为它是懒惰的。 - Wiktor Stribiżew$
,这样懒惰量词才能匹配到输入的结尾,对吗?为什么它不是隐含的呢?我读了你关于“温和贪婪标记”的答案,现在更清楚了。我只需要在 URL 不包含其他http://
时进行匹配,而使用我的当前正则表达式时,当包含http://
时也会有匹配。顺便说一下,谢谢你的回答。 - Marco Luzzara(?>https?://\S+?/(?:(?!https?://).)*)(?!https?://)
的东西。 - Wiktor Stribiżew