3

您将如何编写正则表达式来查找以下文件的文件扩展名,请记住我要查找的是字符串的“.pdf”或“.xls”部分?

  • 报告PDF.20130810.pdf.pgp
  • 报告XLS.20130810.xls.pgp

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

  • 报告20130810.PDF
  • 报告20130810.XLS

我在 Windows 平台上。我在http://regexpal.com/上玩过这个,但到目前为止我只能弄清楚如何匹配日期:

([0-9]{4}[0-9]{2}[0-9]{2})
4

7 回答 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
于 2013-08-29T17:59:54.093 回答
1

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

perl -lpe "s/^([^.]*)(...)\.(\d+)(\.\2)\.pgp/\1\3\4/i; $_=uc"
于 2013-08-29T18:25:39.837 回答
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

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

于 2013-08-29T18:10:24.233 回答
1

我认为这对你有用:)

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

正则表达式可视化

在 Debuggex 上实时编辑

^ 从字符串的开头开始

(.*) 之前的任何字符

\d 任何数字 0-9

{8} 该字符部分仅 8 次(在本例中为数字 0-9 的 8 次)

?: 是非捕获组

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

这个可以更换

([A-Z a-z]*)

(REPORT)
于 2013-08-29T18:09:12.657 回答
1

.+\.(\w+)\.\w+$将作为第 1 组提供最后一个扩展,如何访问它取决于您的正则表达式的宿主语言。

于 2013-08-29T17:55:54.720 回答
1

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

  • 'hello.1a.2bb.3' ---> group(1) == 'hello.1a.2bb', group(2) == '.3'
  • 'yep.1' ---> group(1) == 'yep', group(2) == '.1'
于 2018-06-22T18:54:54.790 回答
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
于 2013-08-29T18:27:22.490 回答