You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式实现:仅匹配字符串中多次出现字符的最后一次实例

解决思路:用正则匹配仅多次出现字符的最后一次实例

嘿,这个需求很明确,我们可以通过**正向预查(lookbehind)**来实现你要的效果——只在字符串中存在至少两个目标字符(这里是点.)时,匹配最后一个出现的目标字符及其后续内容(也就是文件扩展名)。

针对你的文件扩展名场景的正则表达式

直接上可以用的正则:

\.(doc)$(?<=.*\..*)

如果你的扩展名不固定,想要匹配任意扩展名,可以用更通用的版本:

(\.[^.]+)$(?<=.*\..*)

逐部分解释正则逻辑

  • (\.[^.]+)$:这部分负责匹配字符串末尾的扩展名。\.匹配点字符,[^.]+匹配后续所有非点的字符(也就是扩展名本身),$确保我们匹配的是字符串的最后一段。
  • (?<=.*\..*):这是关键的正向预查条件,它会检查当前匹配的点字符之前,字符串中至少还存在另一个点字符。.*\..*表示“任意字符+一个点+任意字符”,确保文件名本身包含至少一个点,满足你“仅针对文件名含有点的文件”的要求。

用你的示例文件测试验证

我们把三个文件名代入测试:

  • this-is-a-filename-we-dont-change.doc:字符串中只有扩展名的一个点,预查条件不满足,不匹配.doc
  • this.is.a.filename.we-will-change.doc:文件名本身有多个点,预查条件满足,精准匹配最后的.doc
  • this_is_a_filename_we_dont_change.doc:字符串中只有扩展名的一个点,预查条件不满足,不匹配.doc

替换使用示例

在支持正则替换的工具(比如VS Code的查找替换、sed、Python的re模块)中,把匹配到的内容替换为空,就能自动移除第二个文件的扩展名,而保留另外两个文件的扩展名不变。

比如用Python代码实现:

import re

filenames = [
    "this-is-a-filename-we-dont-change.doc",
    "this.is.a.filename.we-will-change.doc",
    "this_is_a_filename_we_dont_change.doc"
]

pattern = r"(\.[^.]+)$(?<=.*\..*)"
for name in filenames:
    result = re.sub(pattern, "", name)
    print(result)

运行后输出:

this-is-a-filename-we-dont-change.doc
this.is.a.filename.we-will-change
this_is_a_filename_we_dont_change.doc

内容的提问来源于stack exchange,提问作者omni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:05:49