正则表达式是:
/^\/node?(?:\/(\d+)(?:\.\.(\d+))?)?/
我可以理解,/
在开头和结尾都是正则表达式分隔符,^\/node
也适用于以/node
开头的字符串。之后发生的事情正在打败我!
答案 0 :(得分:5)
你应该考虑使用像RegexBuddy这样的工具。它将解释给定正则表达式中的所有内容,以及它如何编译以及如何分支。
假设PCRE或类似的:
/ //begin
^ //start of string
\/ //literal /
node? //I assume node is optional, normally it'd be (node)?
//? makes the previous expression optional
(
?: //non-capturing group (think of it like dont capture <this>)
\/ //literal /
(\d+) // one or more digits, 0-9
(
?: // another non-capturing group
\.\. // literal ..
(\d+) // one or more digits 0-9
)
? // optional once more
)
? // make the previous group optional
/ // end
答案 1 :(得分:3)
?
此后的任何内容均为“可选”
(?:
非捕获组
\/
已转义/
(\d+)
- 超过1位数 - 同样在捕获组“()”
(?:
\.
- 逃脱。
\.
- 再次
(\d+)
- 与之前相同
)?)?
- 不确定 - 这是什么样的正则表达式?
答案 2 :(得分:3)
你是对的,开头的/
是模式分隔符。让我们删除那些简单
^\/node?(?:\/(\d+)(?:\.\.(\d+))?)?
(?:...)
是非捕获组。这是一个没有被抓到一个匹配组的组。这是一个优化,让我们删除?:
以使模式更清晰。
^\/node?(\/(\d+)(\.\.(\d+))?)?
\
是一个转义字符,因此\/
实际上只是一个/
,但由于它们表示模式的开头和结尾,因此需要进行转义。 .
匹配(差不多)任何字符,因此它也需要进行转义。
?
使后退模式可选,因此()?
表示括号中的任何内容都显示为零或一次。
^
表示字符串的开头\/node?
匹配/node
或/nod
\/(\d+)
匹配/
后跟一个或多个数字(\d+
)。数字被捕获到第一个匹配组(\.\.(\d+))?
匹配..
后跟一个或多个数字(\d+
)。数字将被捕获到第二个匹配组