2009-06-20 5 views
4

J'ai un tas de fichiers qui ressemblent à ceci:comment éliminer les points de noms de fichiers, à l'exception de l'extension de fichier

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

Ce que je veux transformer par une expression régulière dans:

A File With Dots Instead Of Spaces.Extension 

Il doit être dans une regex (parce que je veux l'utiliser avec l'outil de renommage par lots de Total Commander). Aidez-moi, gourous regex, vous êtes mon seul espoir.

Modifier

Plusieurs personnes ont suggéré des solutions en deux étapes. Deux étapes rendent vraiment ce problème trivial, et j'espérais vraiment trouver une solution en une étape qui fonctionnerait dans TC. J'ai fait, BTW, réussi à trouver une solution en une seule étape qui fonctionne tant qu'il y a un nombre pair de points dans le nom du fichier. Donc, j'espère toujours une expression de balle d'argent (ou une preuve/explication de pourquoi on est strictement impossible).

+0

Pourriez-vous poster votre solution ici? – Helen

+0

@Helen: remplacer "\. ([^.] +) \." avec "1 $". Cela fonctionne pour tous les noms de fichiers avec un nombre impair de points. –

Répondre

1

est ici une fonction de votre presque solution:

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

Ceci est, à peu près, « toute substance de point, le point en moins, et peut-être plus une autre substance de point à la fin de la ligne. » Je ne pouvais pas dire si vous vouliez que les points soient supprimés ou tournés vers des espaces - si ce dernier, changez la substitution en "\ 1" (moins les guillemets, bien sûr).

[Edité changer le + à un *, comme ci-dessous de Helen.]

1

En gros:

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

fera en termes purs regex. Cela signifie, remplacer toute période qui est suivie par une chaîne de caractères (non gourmande), puis une période sans rien. C'est un positive lookahead.

En PHP cela se fait comme:

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

D'autres langues varient mais le principe est le même.

+0

Je ne pense pas que le? après le. * est nécessaire ... il faudra juste faire marche arrière de toute façon. * certains * moteurs regex * pourraient * être en mesure de l'optimiser un peu mieux, mais [^.] * fonctionnerait de manière optimale même pour un moteur regex vraiment non optimisé. –

+0

En règle générale, vous voulez probablement éviter de revenir en arrière si vous le pouvez. – cletus

+0

la plupart des moteurs regex vont faire marche arrière indépendamment du? être là ou pas, c'est juste une question de savoir jusqu'où ils vont faire marche arrière. –

0

Vous pouvez le faire avec Lookahead. Cependant, je ne sais pas quel type de support regex vous avez.

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

ce qui se traduit à peu près à tout point éventuel /\./ qui a quelque chose et un point après. Évidemment, le dernier point est le seul qui ne se conforme pas. Je laisse de côté "l'optionalité" de quelque chose entre les points, parce que les données semblent être quelque chose qui sera toujours entre et l'optionalité a un coût de performance.

Vérifier: http://www.regular-expressions.info/lookaround.html

4

Il apparaît la bibliothèque regex de Total Commander ne prend pas en charge les expressions lookaround, vous allez probablement devoir remplacer un certain nombre de points à la fois, jusqu'à ce qu'il n'y a pas de points à gauche. Remplacer:

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

avec

$1 $2 $3.$4 

(Répétez la séquence et le nombre de références arrières pour plus d'efficacité, vous pouvez aller jusqu'à 9 $, ce qui peut ou peut ne pas être suffisant..)

Il ne semble pas qu'il y ait moyen de le faire avec une expression unique et définitive dans Total Commander, désolé.

+1

Il n'est pas nécessaire d'échapper les points dans les classes de caractères: ([^.] *) \. ([^.] *) \. ([^.] *) \. ([^.] *) $ – Helen

1

Ou remplacer tous les points avec l'espace, puis remplacer [espace] [Extension] avec. [Extension]

A.File .With.Dots.Instead.Of.Spaces.Extension à un fichier avec points au lieu de les espaces d'extension à un fichier avec points de lieu Spaces.Extension

0

un autre modèle pour trouver tous les points, mais le dernier dans un (Windows) le nom de fichier que j'ai trouvé fonctionne pour moi dans le fichier de masse Renamer est:

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

Je ne sais pas comment utile qui est à d'autres utilisateurs, mais cette page est un résultat de recherche précoce et si cela avait été ici, il me aurait sauvé un certain temps.

Il exclut le résultat s'il est suivi d'une séquence ininterrompue de caractères alphanumériques conduisant à la fin de l'entrée (nom de fichier) mais trouve sinon toutes les occurrences du caractère point.

Questions connexes