您将如何编写正则表达式来查找以下文件的文件扩展名,请记住我要查找的是字符串的“.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})
您将如何编写正则表达式来查找以下文件的文件扩展名,请记住我要查找的是字符串的“.pdf”或“.xls”部分?
编辑: 我想最终得到的文件名如下:
我在 Windows 平台上。我在http://regexpal.com/上玩过这个,但到目前为止我只能弄清楚如何匹配日期:
([0-9]{4}[0-9]{2}[0-9]{2})
使用 sed:
sed 's/^\(.*[^.]*\)\.[^.]*$/\1/' <<< "REPORTPDF.20130810.pdf.pgp"
REPORTPDF.20130810.pdf
使用grep -P
(PCRE 正则表达式):
grep -oP '^.+[^.]+(?=\.[^.]+$)' <<< "REPORTPDF.20130810.pdf.pgp"
REPORTPDF.20130810.pdf
你没有说你正在使用什么语言/库,但是这个 Perl 单行代码可以解决问题:
perl -lpe "s/^([^.]*)(...)\.(\d+)(\.\2)\.pgp/\1\3\4/i; $_=uc"
如果您不需要将文件扩展名大写,这应该可以
([a-zA-Z]+)\.([0-9]{4}[0-9]{2}[0-9]{2})\.(xls|pdf)\.pgp
火柴:
REPORTXLS.20130810.xls.pgp
然后你要使用的组是两个和三个
REPORT\2.\3
火柴:
REPORT20130810.xls
问题是您没有为如何更改这些文件名提供太多上下文。
我认为这对你有用:)
^(([A-Z a-z]*)(?:XLS.|PDF.)(\d{8})(.pdf|.xls))
^ 从字符串的开头开始
(.*) 之前的任何字符
\d 任何数字 0-9
{8} 该字符部分仅 8 次(在本例中为数字 0-9 的 8 次)
?: 是非捕获组
我将捕获组包装成一个大的,因此您想要的东西将在第一个捕获组中:)。
这个可以更换
([A-Z a-z]*)
和
(REPORT)
.+\.(\w+)\.\w+$
将作为第 1 组提供最后一个扩展,如何访问它取决于您的正则表达式的宿主语言。
这(.*?(?:\..*)?)(\..*)
将包含以下内容:
如果格式几乎是固定的,您可以使用
(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