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次a而不是正斜杠,然后匹配a^(?:[^/]+/){3}$
/
关闭正向前瞻)
或|
在上一个匹配的末尾而不是开始时断言位置\G(?!^)
关闭非捕获组)
不匹配正斜杠,然后[^/]+/
/
请参见a您是否只允许3个组?您想要组1、2和3,还是只想要3个捕获组?当然,我想要访问每个组($1、$2、$3)。例如,组的数量在这里。是的,必须完全一致,即3个组。@grinz Good tags edit,谢谢。.我添加了nginx、perl它们的目的
(?:(?=^(?:[^/]+/){3}$)|\G(?!^))[^/]+/