这一刻我有这样的字符串:
"document.info.userId"
(json属性路径)和正则表达式模式来验证它们:([\w]+\.)+[\w]+$
但似乎有这样的字符串:"document.role#0.id"
(数组的一些额外标记)并且它们有效,但我无法确定要使用哪个正则表达式模式。该索引(#0,#1等)只能在点之前,而不能在任何路径部分的中间。
我已经尝试过模式([\w#]+\.)+[\w#]+$
和([\w]+(#\d+)*\.)+[\w]+(#\d+)*$
,但他们会传递无效路径:test.some#a.hello
应该通过:
"document.role.id"
"document.role.id.and.other.very.long.path.example"
"document.role#0.id"
"document#1.role#0.id"
"document#1.role#0#1.id"
"document#1.role#0#1.id#21" - terrible representation of array in array
不应该通过:
"document."
"document.role."
".document"
"test.some#a.hello"
"docum#ent.role.id"
"document.role.#id"
"docu#1ment.role.id"
"document.ro#0#1le.id"
答案 0 :(得分:3)
您可以添加可选的#[\d]
:
^([\w]+(#[\d])*\.)+[\w]+$
^^^^^^^^
这样,文本#N
,N是一个整数,可以发生也可以不发生。
在https://regex101.com/r/mZ3mZ6/2
中查看一些示例输入考虑到您稍后添加的所有样本:
^([\w]+(#[\d]+)*\.)+[\w]+(#[\d]+)*$
这样我们也检查#N
,N是任何整数(不只是一个数字),也允许最后一个块包含这样的说明符。
在https://regex101.com/r/mZ3mZ6/3中查看所有案例。
答案 1 :(得分:3)
尝试
^\w+(?:#\d+)*(?:\.\w+(?:#\d+)*)*$
首先检查一个单词后跟任意数量的索引(#N
)。这可以选择性地跟随任意数量的.
并再次进行相同的检查(单词和索引)。
答案 2 :(得分:0)
长期解决方案但有效:
^(\w+(?:(#[\d]+)*)?\.)(\w+(?:(#[\d]+)*)?\.)+(\w+(?:(#[\d]+)*)?)