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

时间:2013-08-29 17:50:56

标签: regex

如何编写正则表达式来查找以下文件的文件扩展名,请记住我要查找的是字符串的“.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})

7 个答案:

答案 0 :(得分:1)

.+\.(\w+)\.\w+$会将最后一个扩展名作为第1组传递,然后如何访问它将依赖于正则表达式的宿主语言。

答案 1 :(得分:1)

使用sed:

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

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

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

答案 2 :(得分:1)

我认为这对你有用:)

^(([A-Z a-z]*)(?:XLS.|PDF.)(\d{8})(.pdf|.xls))

Regular expression visualization

Edit live on Debuggex

  

^从字符串的开头

开始      

(。*)

之前的任何字符      

\ d任意数字0-9

     

{8}该字符部分只有8次(在这种情况下是8次   数字0-9)

     

?:是非捕获组

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

这可以被替换

([A-Z a-z]*)

(REPORT)

答案 3 :(得分: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

问题是您没有为如何更改这些文件名提供太多上下文。

答案 4 :(得分:1)

你没有说你正在使用什么语言/库,但这个Perl单线程可以解决问题:

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

答案 5 :(得分:1)

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

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

答案 6 :(得分: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