我正在努力寻找一个可以与rfc8141中所述的URN相匹配的正则表达式。 我已经尝试过这个:
\A(?i:urn:(?!urn:)(?<nid>[a-z0-9][a-z0-9-]{1,31}):(?<nss>(?:[a-z0-9()+,-.:=@;$_!*']|%[0-9a-f]{2})+))\z
但这仅与URN的第一部分匹配,而没有组成部分。
例如,假设我们具有相应的URN:urn:example:a123,0%7C00~&z456/789?+abc?=xyz#12/3
我们应该匹配以下组:
答案 0 :(得分:1)
我还没有阅读所有规范,因此可能还有其他规则需要实现,但这应该使您可以选择组件:
\A(?i:urn:(?!urn:)(?<nid>[a-z0-9][a-z0-9-]{1,31}):(?<nss>(?:[-a-z0-9()+,.:=@;$_!*'&~\/]|%[0-9a-f]{2})+)(?:\?\+(?<rcomponent>.*?))?(?:\?=(?<qcomponent>.*?))?(?:#(?<fcomponent>.*?))?)\z
说明:
(?<nss>(?:[-a-z0-9()+,.:=@;$_!*'&~\/]|%[0-9a-f]{2})+)
:-
已移到列表的开头以允许的字符形式考虑,否则表示“范围从,
到.
”。字符&
,~
和/
(必须用“ \”转义)也已添加到列表中,否则将与您的示例不匹配。(?:\?\+(?<rcomponent>.*?))?
:位于可选的非捕获组(?:)?
中,以防止捕获标识符(?+
,?=
和#
部分) 。字符?
和+
必须以“ \”进行转义。将捕获任何内容(.
,但以惰性模式(*?
),否则找到的第一个组件将捕获所有内容,直到字符串结尾。请参见Regex101
中的工作示例希望有帮助
答案 1 :(得分:0)
如果要使用统一资源名称 (URN) 8141 验证字符串:rfc8141 可以参考 URN8141Test.java 和 URN8141.java
它已经在我们的团队中使用了几年。