douxiyi2418 2016-02-12 11:33
浏览 159
已采纳

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

I'm trying to build a regex that will replace the tokens %aa% and %cc% inside a string. All the cases are listed below:

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%

I have the following regex which covers most of the case expect 2 and 5, basically those that contain the same chars as the tokens.

Regex pattern: %(?|(?|aa)|(?|cc))%(?=[^(aa|cc)]*($)+)

Language is PHP.

Thanks.

  • 写回答

1条回答 默认 最新

  • doulou0882 2016-02-12 11:41
    关注

    Your regex contains redundant branch reset groups ((?|...|...)) and the corrupt grouping that is placed into a character class [^(aa|cc)]*, and an end of string anchor quantified (($)+), which is also a user error (no need to capture the anchor here and it is enough to test it once).

    You can use the following regex:

    '~%(?:aa|cc)%(?!.*%(?:aa|cc)%)~'
    

    See regex demo

    For standalone strings, you can also add the ~s singleline (DOTALL) modifier: '~%(?:aa|cc)%(?!.*%(?:aa|cc)%)~s'.

    The (?!.*%(?:aa|cc)%) negative lookahead fails a match if either aa or cc appear after the aa or cc found so far.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值