具有特定符号的正则表达式数学路径

时间:2016-06-29 06:59:44

标签: c# regex

这一刻我有这样的字符串: "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"

3 个答案:

答案 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)。这可以选择性地跟随任意数量的.并再次进行相同的检查(单词和索引)。

Check it out here at regex101

答案 2 :(得分:0)

长期解决方案但有效:

^(\w+(?:(#[\d]+)*)?\.)(\w+(?:(#[\d]+)*)?\.)+(\w+(?:(#[\d]+)*)?)