正则表达式捕获最后一个子模式

时间:2016-02-12 11:33:41

标签: php regex

我正在尝试构建一个正则表达式,它将替换字符串中的标记%aa%和%cc%。所有案例如下:

1) /%aa%/%cc%/bb   => should replace only %cc%
2) /%aa%/%cc%/ac   => should replace only %cc%
3) /bb/%aa%/%cc%   => should replace only the last %cc%
4) /bb/%aa%        => should replace %aa%
5) /bb/ac/%aa%/%cc%/ac/bb => should replace only the last %cc%

我有以下正则表达式,涵盖了大多数情况下的期望2和5,基本上包含与标记相同的字符。

正则表达式模式:%(?|(?|aa)|(?|cc))%(?=[^(aa|cc)]*($)+)

语言是PHP。

感谢。

1 个答案:

答案 0 :(得分:0)

您的正则表达式包含冗余分支重置组(403 (Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.) )和放入字符类 <Type Name="Windows.UI.Text.FontWeights" Dynamic="Required All" /> 的损坏分组,以及字符串锚定量结束((?|...|...)),其中也是一个用户错误(不需要在这里捕获锚点,只需测试一次)。

您可以使用以下正则表达式:

[^(aa|cc)]*

请参阅regex demo

对于独立字符串,您还可以添加($)+单行(DOTALL)修饰符:'~%(?:aa|cc)%(?!.*%(?:aa|cc)%)~'

如果在~s'~%(?:aa|cc)%(?!.*%(?:aa|cc)%)~s'到目前为止(?!.*%(?:aa|cc)%)之后显示aacc,则aa否定前瞻会失败。