2009-05-26 12 views
2

Kann mir jemand mit einem regex helfen zu drehen: Regex, um Zeichenfolge durch eine andere Zeichenfolge in MS Word zu ersetzen?

filename_author 

zu

author_filename 

Ich bin mit MS Word 2003 und ich versuche, dies zu tun mit Word Find-and-Replace. Ich habe versucht, die use wildcards Funktion, aber hatte kein Glück.

Kann ich es nur programmatisch machen? Hier

+3

Welche Sprache verwenden Sie? – Gumbo

+0

Eigentlich muss ich das für einen Editor verwenden, der regex unterstützt. C++/C# sollte in Ordnung sein, nehme ich an. –

+0

-1: Welche Sprache? Welcher Herausgeber? –

Antwort

13

ist die regex:

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

Und hier ist ein C# Beispiel:

using System; 
using System.Text.RegularExpressions; 

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

Hier ist ein Python-Beispiel:

from re import sub 

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

Edit: Um dies in Microsoft Word zu tun als Platzhalter verwenden, um dies als Suchbegriff:

(<*>)_(<*>)

und ersetzen mit diesem:

\2_\1

Lesen Sie bitte auch Add power to Word searches with regular expressions für eine Erklärung der Syntax ich oben verwendet haben:

  • Der Stern (*) gibt den gesamten Text im Wort.
  • Die Symbole Kleiner als und Größer als (<>) markieren den Anfang und das Ende jedes Wortes. Sie sicherstellen, dass die Suche ein einzelnes Wort zurückgibt.
  • Die Klammern und der Abstand zwischen ihnen teilen die Wörter in verschiedene Gruppen: (erstes Wort) (zweites Wort). Die Klammern geben auch die Reihenfolge an, in der Sie nach suchen möchten, um jeden Ausdruck auszuwerten.
+0

Ich muss das vielleicht in Code tun, denke ich. Weißt du, was ich brauche, wenn ich den zweiten Teil durch einen festen Text wie "myname_filename" ersetzen muss? –

+0

Danke. Das hat den Trick gemacht. –

2

Hier gehen Sie:

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

Je nach Kontext, dass ein wenig gierig sein könnte.

1

In .NET könnten Sie ([^_]+)_([^_]+) als Regex und dann $2_$1 als das Substitutionsmuster für diese sehr spezifische Art von Fall verwenden.Wenn Sie mehr als 2 Teile benötigen, wird es viel komplizierter.

+0

Wie andere bemerkt haben, wäre (. *) Besser für den zweiten Teil der Regex als ([^ _] +). –

2

Suchmuster:

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

Ersatz Muster:

$2_$1 
0

In C# können Sie auch etwas tun.

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

Sie fragten nach regex natürlich, aber dies könnte eine gute Alternative sein.

1

Da Sie in MS Word sind, könnten Sie versuchen, nicht zu programmieren. Markieren Sie den gesamten Text, wählen Sie Tabelle -> Konvertieren -> Text in Tabelle. Stellen Sie die Anzahl der Spalten auf 2 ein. Wählen Sie Separate Text um, wählen Sie das Andere Radio und geben Sie ein _ ein. Das wird dir einen Tisch geben. Schalte die zwei Spalten um. Dann wandle die Tabelle mit dem _ wieder in Text um.

Oder Sie könnten das Ganze nach Excel kopieren, eine Formel erstellen, um den Text zu teilen und wieder zu verbinden, und ihn dann kopieren und wieder in Word einfügen. Beide würden funktionieren.

Verwandte Themen