我很难找到一个Regex,它可以与rfc8141中描述的骨灰盒相匹配。我试过这个:
\A(?i:urn:(?!urn:)(?<nid>[a-z0-9][a-z0-9-]{1,31}):(?<nss>(?:[a-z0-9()+,-.:=@;$_!*']|%[0-9a-f]{2})+))\z
但这只与不含组件的瓮的第一部分相匹配。
例如,假设我们有相应的URN:urn:example:a123,0%7C00~&z456/789?+abc?=xyz#12/3,我们应该匹配以下组:
发布于 2019-11-26 10:24:13
我还没有阅读所有的规范,所以可能还有其他的规则需要实现,但是它应该会让您对可选组件有所了解:
\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中的工作示例
希望这有帮助
发布于 2021-03-30 18:19:59
如果要使用统一资源名称(URN) 8141:rfc8141验证字符串,可以引用URN8141Test.java和URN8141.java
它已经在我们的团队中使用了几年。
https://stackoverflow.com/questions/59032211
复制相似问题