我正在尝试使用以下正则表达式匹配 URL,在Java
^http(s*):\\/\\/.+:[1-65535]/v2/.+/component/.+$
使用 URL 测试失败:https://box:1234/v2/something/component/a/b
我怀疑这是导致它的数字范围。请帮助我了解我在这里缺少什么?
请参阅http://www.regular-expressions.info/numericranges.html。你不能只写[1-65535]
匹配1
或65535
。这表示任何数字1-6
,或5
或3
。
您需要的表达式非常冗长,在这种情况下:
([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])
(归功于http://utilitymill.com/utility/Regex_For_Range)
另一个问题是您的http(s*)
. 这必须是https?
因为在其当前形式下它可能允许httpsssssssss://
. 如果您的正则表达式接受公共输入,这是一个问题。
^http(s*)
是错误的,它会允许httpssssss://...
你需要^https?
不过,这不会影响给定的测试。
该组[1-65535]
基本上意味着从 1 到 6 或 5 或 5 或 3 或 5 的数字。甚至可以评估,但您需要在组的末尾加上 +(或 *)。
要更精确地匹配端口,您可以使用[1-6][0-9]{0,4}?
. 这会让你非常接近,但也允许 pe 69999 -{m,n}?
用于指定一个组可以使用的频率(m 到 n 次)
还要照顾其他人指出的(s *)事情!
这将导致:
^https?:\\/\\/.+:[1-6][0-9]{0,4}?/v2/.+/component/.+$