通过 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
我们应该匹配以下组:
- NID - 示例
- NSS - a123,0%7C00~&z456/789(从最后一个 ':' 开始我们匹配 '?+' 或 '?=' 或 '#'
- r-component - abc(从'?+'到'?='或'#'')
- f-component - 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
它已经在我们团队中使用了几年。
我正在努力寻找可以匹配 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
我们应该匹配以下组:
- NID - 示例
- NSS - a123,0%7C00~&z456/789(从最后一个 ':' 开始我们匹配 '?+' 或 '?=' 或 '#'
- r-component - abc(从'?+'到'?='或'#'')
- f-component - 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
它已经在我们团队中使用了几年。