使用正则表达式查找最后一次出现的句点

时间:2016-05-27 12:33:18

标签: regex

我正在尝试创建用于验证网址的正则表达式。我知道有许多先进的,但我想创建自己的学习目的。

到目前为止,我有一个运行良好的正则表达式,但是我想改进URI的TLD部分的验证,因为我觉得它还没有完成。

这是我的正则表达式(或在regexr上找到):

/^[(http(s)?):\/\/(www\.)?a-zA-Z0-9@:._\+~#=]{2,256}\.[a-zA-Z]{2,6}\b([/#?]{0,1}([A-Za-z0-9-._~:?#[\]@!$&''()*+,;=]|(%[A-Fa-f0-9]{2}))*)$/

适用于foo.comhttp://foo.comfoo.co.uk

等链接

当您引入子域名或二级域名(例如co.uk)时会出现问题,因为正则表达式会接受foo.co.ufoo.co.

我确实尝试使用以下内容在最后.之后选择子字符串:

/[(http(s)?):\/\/(www\.)?a-zA-Z0-9@:._\+~#=]{2,256}[^.]{2,}$/

但这阻止我定义URI的path规则。

如何确保最后一个.之后但第一个/?#之前的子字符串长度至少为2个字符?

1 个答案:

答案 0 :(得分:1)

从我所看到的,你几乎就在那里。做了一些修改,似乎有效。

^(http(s)?:\/\/)?(www\.)?[a-zA-Z0-9@:._\+~#=]{2,256}\.[a-zA-Z]{2,6}([/#?;]([A-Za-z0-9-._~:?#[\]@!$&''()*+,;=]|(%[A-Fa-f0-9]{2}))*)?$

可以通过

稍微缩短
^(http(s)?:\/\/)?(www\.)?[\w@:.\+~#=]{2,256}\.[a-zA-Z]{2,6}([/#?;]([-\w.~:?#[\]@!$&''()*+,;=]|(%[A-Fa-f0-9]{2}))*)?$

(基本上只是调整你的正则表达式)

主要区别在于参数部分是可选的,但如果它在那里则必须以/#?;之一开始。这部分也可能会被简化。

Check it out here

修改

经过一些实验后,我认为这个问题很简单,它会得到:

^(http(?:s)?:\/\/)?([-.~\w]+\.[a-zA-Z]{2,6})(:\d+)?(\/[-.~\w]*)?([@/#?;].*)?$

它还捕获单独的部分 - 方案,主机,端口,路径和查询/参数。

Example here