使用RFC8141匹配URN的正则表达式

时间:2019-11-25 12:48:10

标签: c# .net regex urn

我正在努力寻找一个可以与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(从最后一个':'tl​​l匹配'?+'或'?='或'#'
  • r-component-abc(从'?+'直到'?='或'#'')
  • f组件-12/3(从“#”到结尾)

2 个答案:

答案 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.javaURN8141.java

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