通过 rfc8141 匹配 URN 的正则表达式

Regex which matches URN by rfc8141

我正在努力寻找可以匹配 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 我们应该匹配以下组:

我还没有阅读所有规范,因此可能还有其他规则需要实施,但它应该让您了解可选组件:

\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})+)- 已移至列表的开头以考虑在允许的字符中,否则它表示 "range from , to ."。字符 &~/(必须用“\”转义)也已添加到列表中,否则它将与您的示例不匹配。
  • 可选组件:(?:\?\+(?<rcomponent>.*?))?:在可选的非捕获组 (?:)? 内,以防止捕获标识符(?+?=#部分)。字符 ?+ 必须用“\”转义。将捕获任何内容 (.),但在惰性模式下 (*?),否则找到的第一个组件将捕获所有内容,直到字符串结束。

参见 Regex101

中的工作示例

希望对您有所帮助

如果要验证具有统一资源名称 (URN) 8141 的字符串:rfc8141 You can refer to URN8141Test.java and URN8141.java

它已经在我们团队中使用了几年。