这个特定的正则表达式做了什么?

时间:2013-08-10 18:48:59

标签: regex

正则表达式是:

/^\/node?(?:\/(\d+)(?:\.\.(\d+))?)?/

我可以理解,/在开头和结尾都是正则表达式分隔符,^\/node也适用于以/node开头的字符串。之后发生的事情正在打败我!

3 个答案:

答案 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+)。数字将被捕获到第二个匹配组