描述
此表达式将返回第二个值,如果是数字则返回第三个值。
^/(?:[^/]*/){1}([^/]*)/(?:(\d{1,})|[^/]*)/.*?$
^\/(?:[^\/]*\/){1}([^\/]*)\/(?:(\d{1,})|[^\/]*)\/.*?$
这是相同的表达式,但是正斜杠已被转义,因为某些语言需要
^
匹配一行的开头
/
匹配正斜杠
(?:[^/]*/)
匹配一组文本后跟一个斜线,该组匹配一个未捕获的
{1}
尽管在功能上与此相同,+
但开发人员能够通过简单地更改括号内的值来选择要跳过的 X 个斜线分隔字段
([^/]*)
捕获非斜线字符串
/
匹配斜线
(?:
启动一个非捕获组,这允许or
条件只匹配包含的表达式
(\d{1,})
捕获一组数字,尽管在功能上与此相同,但+
开发人员能够选择最小和如果需要的最大数字数,这些数字必须通过简单地更改括号内的值来呈现
|
或者
[^/]* match a group of text
)
非捕获组结束
/
匹配下一个斜线
.*?$
匹配剩余的字符串直到行尾。
团体
0 接收整个匹配的字符串
- 接收第二个值
- 接收第三个值,只要它是一个数字
免责声明
我不是 Ruby,所以我包含了一个 php 示例来证明该表达式确实有效。
PHP 代码示例:
<?php
$sourcestring="/7/ipsum/dolor/etc
/2/not/17/ipsum/etc";
preg_match_all('/^\/(?:[^\/]*\/){1}([^\/]*)\/(?:(\d{1,})|[^\/]*)\/.*?$/im',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>
$matches Array:
(
[0] => Array
(
[0] => /7/ipsum/dolor/etc
[1] => /2/not/17/ipsum/etc
)
[1] => Array
(
[0] => ipsum
[1] => not
)
[2] => Array
(
[0] =>
[1] => 17
)
)