1

Powershell2.0を使用しています。のようなファイル名がありますmy_file_name_01012013_111546.xls。私は取得しようとしていますmy_file_name.xls。私が試してみました:

.*(?=_.{8}_.{6})

my_file_nameを返します。しかし、私が試してみると

.*(?=_.{8}_.{6}).{3}

を返しますmy_file_name_01

拡張子の取得方法がわかりません(任意の3文字です。時刻/日付の部分は常に_8文字_6文字になります。

私はたくさんの例を見て、たくさんのことを試しましたが、運がありませんでした。

4

4 に答える 4

1

名前と拡張子を検索したいだけの場合は、おそらく次のようなものが必要です。^(.*)_[0-9]{8}_[0-9]{6}(\..{3})$

my_file_name後方参照1と.xls後方参照2になります。

他のすべてを削除して答えを返したい場合は、「数字」を何も置き換えないでください'my_file_name_01012013_111546.xls' -replace '_[0-9]{8}_[0-9]{6}' ''。文字列の2ビット(名前と拡張子)を1つの一致として単純に引き出すことはできません。正規表現パターンは、連続するチャンクにのみ一致します。

于 2013-03-05T14:17:09.333 に答える
0

指定した元の正規表現は、その後に14文字ある最大一致を返します(同じである(?=。{14})に変更できます)。

変更すると、その後に14文字+次の3文字の最大一致が返されます。これが、この結果が得られる理由です。

後方参照を使用できる場合は、Inductiveloadで説明されているアプローチの方がおそらく優れています。次の正規表現を使用します。(.*)[_\d]{16}\.(.*)それ以外の場合は、2つの別々の段階で使用します。

  1. 最初の部分を取得します
  2. 拡張子を取得
于 2013-03-05T14:20:50.133 に答える
0

これを試してみてください(テストされていません)が、「my_file_name」の長さ、数字の長さ、およびあらゆる種類の拡張子で機能するはずです。

"my_file_name_01012013_111546.xls" -replace '(?<=[\D_]*)(_[\d_]*)(\..*)','$2'

非正規表現ソリューション:

$a = "my_file_name_01012013_111546.xls"

$a.replace( ($a.substring( ($a.LastIndexOf('.') - 16 ) , 16 )),"") 
于 2013-03-05T14:38:25.270 に答える
0

my_filename_01追加したときに得られる理由は、先読みがゼロ幅であるためです。これは、文字列内の文字を消費しないことを意味します。

あなたが述べたように、その文字列の後に一致するものが続くため、.*(?=_.{8}_.{6})一致しますが、一致が見つかると、消費したのは、だけなので、を追加すると、次の3文字、つまり。が消費されます。my_file_name_.{8}_.{6}my_file_name.{3}_01

あなたのニーズに合う正規表現に関しては、他の人が実行可能な代替案を投稿しています。

于 2013-03-05T15:00:56.823 に答える