如何编码正确的 URI 正则表达式

how to code correct URI regex

有不同的 URI 模式试图找出正确的正则表达式来覆盖所有这些,例如:

1) href="http://site.example.com/category/ 和 2) href="http://site.example.com/en/page/

使用 href=".+..+..+/(.+?)" 尊重第一个 url,第二个 url 跳过 en/page.

如何阅读 href="http://site.example.com/ 之后的所有内容?

应该这样做:

[^\./]+\.[^\./]+\.[^\./]+(?:/(.*))?

即:

[^\./]+ =(除 ./ 之外的任何值)
\. = 点
...? = ...
出现零次或一次 (?:...)? = ... 中的零个或一个,多于一个字符,但不捕获 ....
(?:/(.*))? = 捕获最后一个 / 之后的所有内容,如果有的话。

已测试here

. 在正则表达式中表示 any character (except \n newline)+ 表示 one or more of the previous expression? 表示 0 or 1 of previous expression; also forces minimal matching when an expression might match several strings within a search string(例如 http://regexlib.com/CheatSheet.aspx) .
\. 匹配文字点。
所以你的正则表达式归结为 at least five signs, a slash sign, at least one sign, but you don't have to
这意味着它甚至匹配 http:/。它 确实 匹配您的两个示例(使用 egrepgrep -P 测试),但前提是您将 href=" 替换为 href=\"并保留最后一个 "。否则它将匹配 none。
您可能想要的是:

.+\..+\..+/.*

或者,如果你想确保只匹配 urls,你可以考虑

http[s]?://([a-z]+\.)?[a-z]+\.[a-z]+/?[a-z/]?

http[s]?: 作为固定部分开始表达式(如果 ref 来自安全连接,则为 s)。 [a-z] 表示 match only lowercase letters。您可能会偶然发现名称中没有子域的网站,例如 whosebug.com,第一个 [a-z]+\. 是问号。 url 的结尾也是斜线。 [a-z/] 表示 match only lowercase letters and slashes.