在具有多个句点的文件中查找文件扩展名的正则表达式

3
如何编写正则表达式来查找以下文件的文件扩展名,要注意我要查找的是字符串中的“.pdf”或“.xls”部分?
  • REPORTPDF.20130810.pdf.pgp
  • REPORTXLS.20130810.xls.pgp

编辑: 我希望最终得到的文件名如下:

  • REPORT20130810.PDF
  • REPORT20130810.XLS
我在Windows平台上操作。我已经在http://regexpal.com/上尝试过一些操作,但迄今为止我只能匹配日期:
([0-9]{4}[0-9]{2}[0-9]{2})

告诉我们你想从这些字符串中匹配出的输出。 - progrenhard
你在哪个系统上?Windows?Linux?还是你正在使用某个程序?如果是的话,用的是什么编程语言? - lurker
除非您想更改日期格式,例如从20130810更改为10082013,否则您不需要独立识别日月年。 - Prashant Bhate
7个回答

2

使用sed:

sed 's/^\(.*[^.]*\)\.[^.]*$/\1/' <<< "REPORTPDF.20130810.pdf.pgp"
REPORTPDF.20130810.pdf

使用grep -P(PCRE正则表达式):

grep -oP '^.+[^.]+(?=\.[^.]+$)' <<< "REPORTPDF.20130810.pdf.pgp"
REPORTPDF.20130810.pdf

这很好,但文件名中仍然保留了“PDF”。我想要的结果是“REPORT20130810.pdf”。 - Matt Koch
两个选项都没有给我“PDF”,请问你在使用什么命令? - anubhava

1
我认为这对您有用 :)
^(([A-Z a-z]*)(?:XLS.|PDF.)(\d{8})(.pdf|.xls))

Regular expression visualization

在 Debuggex 上实时编辑

^ 从字符串开头开始

(.*) 之前的任何字符

\d 任何数字0-9

{8} 只有8次该字符部分(在此处为数字0-9的8次)

?: 非捕获组

我将捕获组包装成一个大组,所以您想要的东西将在第一个捕获组中:)。

这可以被替换掉。

([A-Z a-z]*)

带有。
(REPORT)

1
如果您不需要文件扩展名大写,那么这个应该可以工作。
([a-zA-Z]+)\.([0-9]{4}[0-9]{2}[0-9]{2})\.(xls|pdf)\.pgp

匹配项:

REPORTXLS.20130810.xls.pgp

然后你会使用两个和三个组

REPORT\2.\3

匹配:

REPORT20130810.xls

问题在于您没有提供更多的上下文,说明您如何更改这些文件名。

1

您并没有说明您使用的是哪种语言/库,但是这个 Perl 一行代码可以解决问题:

perl -lpe "s/^([^.]*)(...)\.(\d+)(\.\2)\.pgp/\1\3\4/i; $_=uc"

1

.+\.(\w+)\.\w+$将会把倒数第二个扩展名作为第一组进行匹配,如何访问取决于您的主机语言对于正则表达式的支持。


1

这个(.*?(?:\..*)?)(\..*)将包含以下内容:

  • 'hello.1a.2bb.3' ---> group(1) == 'hello.1a.2bb',group(2) == '.3'
  • 'yep.1' ---> group(1) == 'yep',group(2) == '.1'

0
如果格式基本固定,您可以使用:
(REPORT)([^.]++)[.]([^.]++)[.]([^.]++)[.](pgp)

根据您的需求进行挑选替换

这里使用了Java,但正则表达式匹配仍然相同

    String a = "REPORTPDF.20130810.pdf.pgp".replaceAll(
            "(REPORT)([^.]++)[.]([^.]++)[.]([^.]++)[.](pgp)",
            "$1--$2--$3--$4--$5");
    ;

    String b = "REPORTXLS.20130810.xls.pgp".replaceAll(
            "(REPORT)([^.]++)[.]([^.]++)[.]([^.]++)[.](pgp)",
            "$1--$2--$3--$4--$5");

    System.out.println(a);
    System.out.println(b);


REPORT--PDF--20130810--pdf--pgp
REPORT--XLS--20130810--xls--pgp

在你的情况下,"$1$3.$2"

    String b = "REPORTXLS.20130810.xls.pgp".replaceAll(
            "(REPORT)([^.]++)[.]([^.]++)[.]([^.]++)[.](pgp)",
            "$1$3.$2");

能够产生预期结果

REPORT20130810.XLS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接