2009-05-26 11 views
2

Quelqu'un peut-il me aider avec une expression régulière à tourner:Regex pour remplacer la chaîne avec une autre chaîne dans MS Word?

filename_author 

à

author_filename 

J'utilise MS Word 2003 et essaie de le faire avec la Recherche et remplacement de Word. J'ai essayé la fonctionnalité use wildcards mais je n'ai pas eu de chance. Est-ce que je vais seulement pouvoir le faire par programme?

+3

Quelle langue utilisez-vous? – Gumbo

+0

En fait, j'ai besoin de l'utiliser sur un éditeur qui supporte regex. C++/C# devrait être bien je suppose. –

+0

-1: quelle langue? Quel éditeur? –

Répondre

13

Voici le regex:

([^_]*)_(.*)

Et voici un exemple C#:

using System; 
using System.Text.RegularExpressions; 

class Program 
{ 
    static void Main() 
    { 
     String test = "filename_author"; 
     String result = Regex.Replace(test, @"([^_]*)_(.*)", "$2_$1"); 
    } 
} 

Voici un exemple Python:

from re import sub 

test = "filename_author"; 
result = sub('([^_]*)_(.*)', r'\2_\1', test) 

Edit: Pour ce faire dans Microsoft Word à l'aide des caractères génériques utiliser comme une chaîne de recherche:

(<*>)_(<*>)

et les remplacer par ceci:

\2_\1

En outre, s'il vous plaît voir Add power to Word searches with regular expressions pour une explication de la syntaxe que je l'ai utilisé ci-dessus:

  • L'astérisque (*) renvoie tout le texte dans le mot.
  • Les symboles inférieur et supérieur à (<>) marquent respectivement le début et la fin de chaque mot. Ils s'assurent que la recherche renvoie un seul mot .
  • Les parenthèses et l'espace entre elles divisent les mots en groupes distincts: (premier mot) (deuxième mot ). Les parenthèses indiquent également l'ordre dans lequel vous voulez que la recherche à évalue chaque expression.
+0

Je devrais faire ceci dans le code je devine. Savez-vous ce dont j'aurais besoin, si je dois remplacer la seconde partie par un texte fixe comme "myname_filename"? –

+0

Merci. Cela a fait l'affaire. –

2

Ici, vous allez:

s/^([a-zA-Z]+)_([a-zA-Z]+)$/\2_\1/ 

En fonction du contexte, qui pourrait être un peu gourmand.

1

Dans .NET, vous pouvez utiliser ([^_]+)_([^_]+) comme regex, puis $2_$1 comme modèle de substitution, pour ce type de cas très spécifique.Si vous avez besoin de plus de 2 pièces, cela devient beaucoup plus compliqué.

+0

Comme d'autres l'ont noté, (. *) Serait meilleur pour la deuxième partie de l'expression rationnelle que ([^ _] +). –

2

modèle de recherche:

([^_]+)_(.+) 

modèle de remplacement:

$2_$1 
0

En C#, vous pouvez aussi faire quelque chose comme ça.

string[] parts = "filename_author".Split('_'); 
return parts[1] + "_" + parts[0]; 

Vous avez demandé à propos de regex bien sûr, mais cela pourrait être une bonne alternative.

1

Puisque vous êtes en MS Word, vous pouvez essayer une approche sans programmation. Mettez en surbrillance tout le texte, sélectionnez Tableau -> Convertir -> Texte en tableau. Définissez le nombre de colonnes à 2. Choisissez Séparer le texte à, sélectionnez la radio Autre et entrez un _. Cela vous donnera une table. Basculer les deux colonnes. Ensuite, convertissez la table en texte en utilisant le _ à nouveau.

Ou vous pouvez copier le tout dans Excel, construire une formule pour diviser et rejoindre le texte, puis le copier et le coller dans Word. L'un ou l'autre travaillerait.

Questions connexes