仅当某个字符在该字符串中多次出现时才匹配该字符在该字符串中的最后一次出现

Match last occurance of a character in a string only if it appears multiple times in that string

我想用 RegEx 来完成标题所说的事情。 因此,让我们举一个简单的例子:假设我们要删除文件扩展名(包括点字符),但仅限于名称中包含点字符的文件。鉴于此示例列表:

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

由于第二个文件的文件名中有一个(或多个)点,我们希望仅在 .doc 上匹配该行。

我从像 .[^.$]*$ 这样简单的东西开始,但这有两个问题:

  1. 如果我们有空行,它会换行
  2. 它还会匹配其他文件名,而不仅仅是第二个文件名

有什么建议吗?

您可以将此正则表达式与否定字符一起使用 class:

\.[^.\n]*\K\.[^.\n]+$

RegEx Demo

[^.\n] 将匹配一个不是点也不是换行符的字符。

\K用于重置PCRE中的匹配信息