如何编写匹配tcp://serverName:port/SearchServer的Regex校验规则
原有正则的错误点
- 锚点用法错误:
^和$是匹配整个字符串的起止标识,只能放在正则的首尾位置,你把它们放在正则中间,会被识别为普通字符要求匹配,直接导致正常URL无法命中规则。 - 量词使用错误:
?表示匹配0次或1次,你用来匹配主机名、端口这类长度肯定大于1的内容,完全不符合实际业务场景。 - 分隔符逻辑混乱:主机名和端口之间的
:被你错误包裹在/^:/$规则中,额外引入了不需要匹配的/字符,也没有正确匹配冒号本身。 - 路径匹配逻辑错误:固定路径
/SearchServer的匹配规则被你错误添加了冗余的/和锚点,完全无法匹配正常路径。
正确的校验规则
你要匹配的tcp://serverName:port/SearchServer格式,按Java语法编写的正则如下,可根据是否要求强制携带tcp://前缀二选一:
// 要求必须携带tcp://前缀的版本 String regex = "^tcp://[A-Za-z0-9-]+:(\\d{1,5})/SearchServer$"; // 允许省略tcp://前缀的版本 String regex = "^(tcp://)?[A-Za-z0-9-]+:(\\d{1,5})/SearchServer$";
规则说明:
^匹配字符串开头,避免URL前出现多余字符(tcp://)?表示tcp://前缀可选,去掉?即要求必须携带前缀[A-Za-z0-9-]+匹配主机名,支持字母、数字、短横线,+要求至少有1个字符:匹配主机名和端口之间的固定分隔符\d{1,5}匹配1-5位数字组成的端口,若需要严格校验端口范围在0-65535区间,可把这部分替换为(0|[1-9]\\d{0,3}|[1-5]\\d{4}|6[0-4]\\d{3}|65[0-4]\\d{2}|655[0-2]\\d|6553[0-5])/SearchServer匹配固定的后缀路径$匹配字符串结尾,避免URL后出现多余字符
内容的提问来源于stack exchange,提问作者Ryan E
相关产品推荐
相关产品推荐

