我需要验证一个字符串以确保它是根据 RFC 6570 的有效 URI 模板。使用正则表达式应该很容易。但是,我没有找到——真的没有用于 URI 模板的 RegEx(还没有)吗?
上下文:我想在使用 node.js 处理的 JSON Schema 中使用它。
我需要验证一个字符串以确保它是根据 RFC 6570 的有效 URI 模板。使用正则表达式应该很容易。但是,我没有找到——真的没有用于 URI 模板的 RegEx(还没有)吗?
上下文:我想在使用 node.js 处理的 JSON Schema 中使用它。
在这里聚会有点晚了,但由于唯一的答案没有解决 URI 模板的正则表达式问题,所以我决定尝试一下,因为我也找不到。这仅基于RFC 6570 第 2 节中的 ABNF 规则,并且我包含了一些 ASCII 艺术来绘制不同的组件。
^([^\x00-\x20\x7f"'%<>\\^`{|}]|%[0-9A-Fa-f]{2}|{[+#./;?&=,!@|]?((\w|%[0-9A-Fa-f]{2})(\.?(\w|%[0-9A-Fa-f]{2}))*(:[1-9]\d{0,3}|\*)?)(,((\w|%[0-9A-Fa-f]{2})(\.?(\w|%[0-9A-Fa-f]{2}))*(:[1-9]\d{0,3}|\*)?))*})*$
\ \_____________/ \\____________/ \\__________________/ \__________________/ /\________________/ / \_________________________________________________________________/ //
\ pct-encoded / \ operator \\ varchar varchar / modifier-level4 / varspec //
\______________________________________/ \ \\________________________________________/ / //
literals \ \ varname / //
\ \_________________________________________________________/ //
\ \ varspec //
\ \____________________________________________________________________________________________________________________________//
\ variable-list /
\_________________________________________________________________________________________________________________________________________/
expression
您可以在regex101.com上查看。这应该适用于 JSON Schema,因为我使用的是 ECMA 语法。可能还可以进行一些简化,但正如我所说,这与 ABNF 一致,因此如果您熟悉规范,它应该相对容易遵循。
我想你可能会在这个用 Java 实现 RFC-6570 的库中找到你想要的东西。
<dependency>
<groupId>com.github.fge</groupId>
<artifactId>uri-template</artifactId>
<version>yourVersionHere</version>
</dependency>
如果在解析过程中出现错误,构造URITemplate
函数将返回一个。URITemplateParseException
final URITemplate template = new URITemplate("http://foo.bar/myPage{?map*}");