Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在正则表达式中捕获组_Regex_Nginx - Fatal编程技术网

Regex 在正则表达式中捕获组

Regex 在正则表达式中捕获组,regex,nginx,Regex,Nginx,我有字符串a/b/c/,我想通过正则表达式得到3个组(a/,b/,c/) 所以,我能做到 ^([^\/]+\/)([^\/]+\/)([^\/]+\/)$ 但是它不是很优雅。 我想做这样的事情 ^([^\/]+\/){3}$ 但我得到警告: A repeated capturing group will only capture the last iteration. Put a capturing group around the repeated group to capture all

我有字符串
a/b/c/
,我想通过正则表达式得到3个组(
a/
b/
c/

所以,我能做到

^([^\/]+\/)([^\/]+\/)([^\/]+\/)$
但是它不是很优雅。 我想做这样的事情

^([^\/]+\/){3}$
但我得到警告:

A repeated capturing group will only capture the last iteration. Put a capturing group around the repeated group to capture all iterations or use a non-capturing group instead if you're not interested in the data
所以,我对数据很感兴趣,但我不明白应该在正则表达式中修改什么才能得到有效的结果

上下文(nginx config)的小示例:


在本例中,我将url从
/a/b/c/
重写为
/c/b/a/

要减少重复,您实在无能为力:

^([^\/]+\/)([^\/]+\/)([^\/]+\/)$
警告告诉您,重复组(如
([^\/]+\/){3}
将只捕获最后一次重复。您可能认为
([^\/]+\/){3}
是3个组,但它只是一个组,因为只有一对括号。该组将包含量词匹配的最后一个内容,在本例中为
c/

所以要有3个组,必须有3对括号

如果确实想缩短正则表达式,可以尝试:

[^\/]+\/
这将创建3个匹配项而不是组,但您必须使用代码检查:

  • 正好有三场比赛
  • 每场比赛的结束就是下一场比赛的开始
  • 第一个匹配从字符串的开头开始
  • 最后一场比赛在字符串末尾结束
为了达到与原始正则表达式相同的效果。

模式
^([^\/]+\/){3}$
将组重复3次,但组1只包含最后一次迭代的值。也许在给定组的返回值是最后一个捕获的值时会有所帮助

如果需要组1、2和3,则必须在模式中使用3个捕获组

不确定这是否更优雅,但可能是一个选项,可以使用
\G
获得3个单独的匹配,以获得迭代匹配和正向前瞻
(?=
,以声明不正斜杠后跟
/
的模式发生3次:

(?:(?=^(?:[^/]+/){3}$)|\G(?!^))[^/]+/
  • (?:
    非捕获组
    • (?=
      正向前瞻,断言右边的是
      • ^(?:[^/]+/){3}$
        匹配3次a而不是正斜杠,然后匹配a
        /
    • 关闭正向前瞻
    • |
    • \G(?!^)
      在上一个匹配的末尾而不是开始时断言位置
  • 关闭非捕获组
  • [^/]+/
    不匹配正斜杠,然后
    /

请参见a

您是否只允许3个组?您想要组1、2和3,还是只想要3个捕获组?当然,我想要访问每个组($1、$2、$3)。例如,组的数量在这里。是的,必须完全一致,即3个组。@grinz Good tags edit,谢谢。.我添加了nginx、perl它们的目的
(?:(?=^(?:[^/]+/){3}$)|\G(?!^))[^/]+/