4

次のようなファイルがたくさんあります。

A.File.With.Dots.Instead.Of.Spaces.Extension

正規表現を介して次のように変換したいもの:

A File With Dots Instead Of Spaces.Extension

これは1つの正規表現に含まれている必要があります(Total Commanderのバッチ名前変更ツールで使用したいため)。

助けてください、正規表現の達人、あなたは私の唯一の希望です。

編集

何人かの人々が2段階の解決策を提案しました。2つのステップでこの問題は簡単になります。私は、TCで機能する1ステップのソリューションを見つけることを本当に望んでいました。ところで、ファイル名に偶数のドットが含まれている限り機能するワンステップソリューションを見つけることができました。ですから、私はまだ銀の弾丸の表現(またはそれが厳密に不可能である理由の証明/説明)を望んでいます。

4

6 に答える 6

4

Total Commanderの正規表現ライブラリはルックアラウンド式をサポートしていないようです。そのため、ドットがなくなるまで、一度に複数のドットを置き換える必要があります。交換:

([^.]*)\.([^.]*)\.([^.]*)\.([^.]*)$

$1 $2 $3.$4

(効率を上げるために、シーケンスと後方参照の数を繰り返します。最大$ 9まで上げることができますが、これで十分な場合と不十分な場合があります。)

申し訳ありませんが、TotalCommanderで単一の決定的な式を使用してそれを行う方法はないようです。

于 2009-06-20T14:36:11.873 に答える
2

基本的に:

/\.(?=.*?\.)//

純粋な正規表現でそれを行います。つまり、ピリオドの後に文字列(欲張りでない)が続き、ピリオドが何もない状態に置き換えます。これは前向きな先読みです。

PHPでは、これは次のように行われます。

$output = preg_replace('/\.(?=.*?\.)/', '', $input);

他の言語は異なりますが、原則は同じです。

于 2009-06-20T14:29:29.983 に答える
1

これがあなたのほぼ解決策に基づくものです:

/\.([^.]*(\.[^.]+$)?)/\1/

これは、大まかに言って、「ドットを除いた任意のドット、および行末にある別のドットを加えたもの」です。ドットを削除するのか、スペースに変換するのか、はっきりとはわかりませんでした。後者の場合は、置換を「\ 1」に変更してください(もちろん、引用符は除きます)。

[以下のヘレンのように、+を*に変更するように編集しました。]

于 2009-06-20T16:54:58.023 に答える
1

または、すべてのドットをスペースに置き換えてから、[スペース][拡張子]を。[拡張子]に置き換えます。

A.File.With.Dots.Instead.Of.Spaces.Extensionをスペースの代わりにドットを含むファイルに拡張するSpaces.Extensionの代わりにドットを含むファイルに拡張する

于 2011-09-28T20:06:51.557 に答える
1

私が見つけた(Windows)ファイル名の最後以外のすべてのドットを見つける別のパターンは、MassFileRenamerで機能します。

(?!\.\w*$)\.

それが他のユーザーにとってどれほど役立つかはわかりませんが、このページは初期の検索結果であり、それがここにあったとしたら、時間を節約できたでしょう。

入力(ファイル名)の終わりにつながる連続した英数字のシーケンスが続く場合は結果を除外しますが、それ以外の場合はドット文字のすべてのインスタンスを検索します。

于 2015-01-07T13:38:01.317 に答える
0

Lookaheadでそれを行うことができます。ただし、どのような正規表現サポートがあるのか​​わかりません。

/\.(?=.*\.)//

これは大まかに/\./、何かとその後にドットがある任意のドットに変換されます。明らかに、最後のドットだけが準拠していません。データは常に何かが間にあるように見え、「オプション」にはパフォーマンスコストがかかるため、ドット間の何かの「オプション」は省略します。

チェック: http: //www.regular-expressions.info/lookaround.html

于 2009-06-20T14:33:25.920 に答える