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})
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

これ(.*?(?:\..*)?)(\..*)は次のようなものを保持します:

  • 'hello.1a.2bb.3' ---> グループ (1) == 'hello.1a.2bb'、グループ (2) == '.3'
  • 'yep.1' ---> グループ (1) == 'うん', グループ (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 に答える