0

正则表达式是:

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

我可以理解,/开头和结尾都是正则表达式分隔符,也适用于以What'staking after that beats me^\/node开头的字符串!/node

4

3 回答 3

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
于 2013-08-10T18:59:51.873 回答
3

?这之后的任何内容都是“可选的”

(?:非捕获组

\/逃脱 /

(\d+)- 超过 1 位 - 也在捕获组“()”中

(?:再次

\.- 逃脱。

\.- 再次

(\d+)- 和之前一样

)?)?- 不确定 - 这是什么风格的正则表达式?

于 2013-08-10T18:59:42.490 回答
3

你是对的/,一开始是模式分隔符。为简单起见,让我们删除那些

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

(?:...)是一个非捕获组。这是一个没有被抓进匹配组的组。这是一个优化,让我们删除?:以使模式更清晰。

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

The\是一个转义字符,所以\/实际上只是一个/,但是因为它们表示模式的开始和结束,所以需要转义。匹配(几乎)任何字符,.因此也需要对其进行转义。

使?后退模式可选,因此()?意味着括号中的任何内容出现零次或一次。

  • ^表示字符串的开始
  • \/node?匹配/node/nod
  • \/(\d+)匹配/后跟一个或多个数字 (the \d+)。数字被捕获到第一个匹配组中
  • (\.\.(\d+))?匹配..后跟一个或多个数字 (the \d+)。数字被捕获到第二个匹配组中
于 2013-08-10T19:03:49.497 回答