Reguläre Ausdrücke
Reguläre Ausdrücke stellen eine gute Möglichkeit dar, um Zeichenfolgen im Text zu suchen. In memoQ werden sie verwendet, um Segmentierungsregeln, Auto-Übersetzungsregeln oder Regeln für den Regex-Tagger zu definieren. Sie können reguläre Ausdrücke auch in Suchen und Ersetzen und in den Filtersteuerelementen im Übersetzungseditor verwenden.
Das Suchen von Zeichenfolgen ist jedem bekannt, der schon einmal ein Textverarbeitungsprogramm oder einen Texteditor verwendet hat. Das Dialogfeld Suchen oder Suchen dient diesem Zweck. Wenn Sie nach "ich" suchen, werden im Editor Wörter (oder Teile von Wörtern) wie "ich", "mich" oder sogar "allmählich" hervorgehoben.
Reguläre Ausdrücke bieten hingegen viel mehr Freiheit, auf dem Computer anzugeben, wonach Sie suchen. Sie können Folgen wie Buchstabe "a" gefolgt von zwei- oder dreimal Buchstabe "c", eine Reihe von Buchstaben gefolgt von einer oder mehreren Ziffern oder eines der Wörter "Katze", "Hund" oder "Maus" finden – und vieles mehr. Nachdem Sie diese Seite durchgelesen und mit den Beispielen experimentiert haben, werden Sie genau wissen, wie das geht.
Hinweis: Der Begriff regulärer Ausdruck stammt von der mathematischen Theorie, auf der diese Mustervergleichsmethode basiert. Er wird häufig als RegExp oder Regex abgekürzt – hier wird Regex bzw. Regexe (Plural) verwendet.
Literal und Meta
In der herkömmlichen Suchfunktion eines Textverarbeitungsprogramms wird jedes Zeichen wörtlich (literal) interpretiert. Wenn Sie nach "Ja? Nein ..." suchen, wird "Ja? Nein ..." hervorgehoben – oder nichts, wenn diese Zeichen im Text nicht vorkommen. In einem Regex haben einige Zeichen eine besondere Bedeutung – sie werden als Meta-Zeichen bezeichnet. Die wichtigsten Meta-Zeichen sind folgende:
Verwirrend? Diese Tabelle ist nur als kurze Zusammenfassung und Referenz gedacht – die Bedeutung all dieser Ausdrücke wird in den Abschnitten unten geklärt.
Fürs Erste konzentrieren wir uns auf den Punkt. In einem Regex bedeutet er "jedes Zeichen kann hier stehen". Daher entspricht der Ausdruck "No..." in einem Regex Folgendem:
- Notes
- Notte
- No...
- No&%X
Was müssen Sie also in einen Regex schreiben, um genau "No..." und keinen anderen Text zu finden? Zum Verwenden eines Zeichens, das eine bestimmte Bedeutung hat, müssen Sie es "escapen", d. h., ihm einen umgekehrten Schrägstrich voranstellen. Daher entspricht "No\.\.\." genau "No..." und nichts anderem.
Testen regulärer Ausdrücke
In memoQ können reguläre Ausdrücke nun auch im Dialogfeld "Suchen und Ersetzen" verwendet werden. Sie können einen regulären Ausdruck testen, indem Sie ein Dokument zur Übersetzung öffnen und dann Strg+F drücken. Geben Sie im Feld "Suchen" den gewünschten regulären Ausdruck ein, und klicken Sie auf "Weitersuchen".
Alternativ können Sie das Dokument im Übersetzungseditor mithilfe von regulären Ausdrücken filtern. Aktivieren Sie oberhalb des Übersetzungsfensters das Kontrollkästchen mit dem Symbol für "Reguläre Ausdrücke verwenden" , und geben Sie dann im Filterfeld über den Ausgangs- oder den Zielsegmenten den regulären Ausdruck ein. Drücken Sie die Eingabetaste: In memoQ werden die Segmente angezeigt, die mit dem regulären Ausdruck übereinstimmen. Hier können Sie beispielsweise sehen, wie Sie nach Segmenten filtern, die Zahlen gefolgt von einem Punkt enthalten:
Wenn Sie ausführlicheres Feedback benötigen, während Sie sich mit regulären Ausdrücken vertraut machen, hier ein Trick, mit dem Sie Auto-Übersetzungsregeln zum Experimentieren mit regulären Ausdrücken "zweckentfremden" können. Erstellen Sie ein Testprojekt, und klicken Sie in der Projektzentrale im Bereich Einstellungen auf die Registerkarte Auto-Übersetzungsregeln. Löschen Sie in dem angezeigten Dialogfeld jede dort bereits vorhandene Regel, und geben Sie eine eigene Regel ein. Fügen Sie für diese Regel auch eine Regel für die Reihenfolge beim Ersetzen hinzu, sodass die Felder des Dialogfelds wie unten dargestellt angezeigt werden. (Welche Bedeutung eine Regel für die Reihenfolge beim Ersetzen hat und warum Sie sie hier brauchen, wird unten erläutert.)
Klicken Sie jetzt auf Vorschau, geben Sie den unten angezeigten Text im Feld Before auto translation ein, und klicken Sie auf die Schaltfläche Vorschau. Folgendes wird angezeigt:
Durch das "x" im Feld Regeln für Reihenfolge beim Ersetzen wird in memoQ Text, dem der angegebene Regex entspricht, durch den Buchstaben "x" ersetzt – so wissen Sie, dass Ihr Regex in diesem Experiment funktioniert. Im Dialogfeld Vorschau der Auto-Übersetzung können Sie genau sehen, welche Teile des von Ihnen angegebenen Texts durch ein "x" ersetzt werden, wodurch Sie Ihren Regex testen können.
Zeichenklassen
Nachdem wir uns nun mit dem Punkt befasst haben und wissen, wie mit neuen Regexen experimentiert wird, kommen wir zu einigen komplizierteren Ausdrücken. Mithilfe von Klammern in Regexen können Sie einen Satz von Zeichen bzw. eine Zeichenklasse angeben. "[ab][01]" entspricht Folgen, die zwei Zeichen lang sind, wobei das erste Zeichen entweder ein "a" oder ein "b" und das zweite entweder eine "0" oder eine "1" ist. Dies ergibt 4 mögliche Treffer: "a0", "b0", "a1", "b1".
Zeichenklassen können verwendet werden, um beispielsweise "eine Ziffer gefolgt von einem Komma oder einem Ausrufezeichen" auszudrücken – was in Form von "[0123456789][,!]" ausgedrückt werden könnte. Dies wäre jedoch sehr umständlich zu schreiben. Regexe bieten eine bessere Lösung: Sie können einen Bereich von Zeichen angeben, indem Sie "[0-9][,!]" schreiben, was genau dem vorherigen Ausdruck entspricht.
Hinweis: Können Sie Bereiche verwenden, um auszudrücken "einem Buchstaben des Alphabets entsprechen"? Ja und nein. Eine typische Lösung hierfür war "[a-z]", was einem beliebigen Buchstaben zwischen a und z entspricht. Berücksichtigen Sie jedoch, dass in memoQ mit vielen verschiedenen Sprachen gearbeitet wird, die häufig Sonderzeichen in ihrem Alphabet aufweisen. Der isländische Buchstabe "đ" beispielsweise ist definitiv nicht im Bereich a-z enthalten. Daher wird in memoQ für Buchstaben des Alphabets eine spezielle Erweiterung verwendet, die unten beschrieben wird.
Berücksichtigen Sie auch, dass alle Buchstaben in memoQ-Regexen unter Beachtung der Groß-/Kleinschreibung interpretiert werden. "[a-z]" entspricht daher "f", aber nicht "F".
Außer anzugeben, was zutreffen soll, können Sie Zeichenklassen verwenden, um anzugeben, was nicht zutreffen soll. Der Regex "[^0a]." entspricht einer unbegrenzten Anzahl von Folgen aus zwei Zeichen, solange das erste Zeichen nicht "0" oder "a" ist.
Escape-Sequenzen
Wie Sie oben gesehen haben, können Sie die ursprüngliche Bedeutung der speziellen Meta-Zeichen angeben, indem Sie ihnen einen umgekehrten Schrägstrich ("\") voranstellen bzw. sie "escapen". Es sind auch andere geeignete Escape-Sequenzen verfügbar. Die wichtigsten für die Zwecke, für die Regexe in memoQ verwendet werden, sind folgende:
Sequenz |
Beschreibung |
\s |
Leerraum: Leerzeichen, Tabstopp oder Zeilenumbruch |
\S |
alles außer Leerraum |
\t |
Tab |
\n |
Neue Zeile |
\d |
Ziffer (zwischen 0 und 9) |
\D |
alles außer Ziffern |
\w |
alphanumerisches Zeichen und Unterstrich |
\W |
alles außer alphanumerische Zeichen |
Quantifizierer
Nun da Sie gelernt haben, einen Satz von alternativen Zeichen anzugeben, die an einer bestimmten Position zutreffen, ist es an der Zeit, weiterzugehen und in memoQ anzugeben, wie viele Zeichen zutreffen sollen. Die Sonderzeichen "*" und "+" und der Ausdruck {num} werden für diesen Zweck verwendet.
- Der Regex "x+" entspricht einer Zeichenfolge, die aus einem oder mehreren "x" besteht – also "x", "xx", "xxx" usw.
- Der Regex "x{3}" entspricht einer Zeichenfolge, die aus genau dreimal "x" besteht – also "xxx", aber nicht "x" oder "xx". Wenn der Text "xxxx" lautet, entspricht der Regex den ersten 3 "x", und das vierte wird ignoriert. Bildlich: "xxxx". Denken Sie zum Vergleich daran, dass das traditionelle Dialogfeld Suchen das Wort "ich" in "mich" findet.
- Sie können den Quantifizierer {num} in einer besonderen Form verwenden, indem Sie einen Minimal- oder Maximalwert (oder beides) angeben. Daher entspricht "x{3,5}" zwischen 3- und 5-mal "x". "x{3,}" entspricht einer Folge mit mindestens 3-mal "x", und "x{,5}" entspricht einer Folge mit höchstens 5-mal "x".
- Der komischste Quantifizierer ist wohl das Sternchen ("*"). Seine Bedeutung lautet "null oder mehr des angegebenen Zeichens entsprechen". Wofür ist das wohl gut? Nun, Sie können beispielsweise angeben "dem Buchstaben "T" entsprechen, dem einige "a" vorausgehen – oder vielleicht keine". Der zugehörige Regex ist "a*T", der "T", "aT", "aaT" usw. entspricht.
- Ein etwas weniger aufregenderer, aber nicht weniger nützlicherer Quantifizierer ist das Fragezeichen. Es hat die Bedeutung, dass null oder einem der Zeichen, die ihm vorangestellt sind, entsprochen werden soll. "ax?y" entspricht daher "ay" und "axy", aber nicht "axxy".
Wenn Sie an Quantifizierern Gefallen finden, ist es an der Zeit, sie mit anderen Zeichensätzen zu kombinieren. Genauso wie nach Zeichen, können Sie Quantifizierer nach Zeichensätzen schreiben. "[0-9]+%" entspricht einer Ziffernfolge gefolgt von einem Prozentzeichen, z. B. "1%" oder "99%", aber nicht "10a%".
Gruppen und Alternativen
Nachdem nun Zeichensätze und Quantifizierer behandelt worden sind, bleiben nur noch zwei Standard-Regex-Funktionen zu erkunden: Gruppen und Alternativen.
Mithilfe des senkrechten Strichs ("|") können Sie mehrere kleinere Regexe aneinanderfügen, um anzugeben "entweder dem, jenem oder dem anderen entsprechen". Der Regex "EUR|USD|GBP" entspricht jedem dieser Wörter – und nur diesen.
Wenn Sie Alternativen verwenden, müssen Sie sie meist mithilfe von Klammern gruppieren, um die gewünschten Ergebnisse zu erzielen. Angenommen, Sie möchten einen Regex, der allen folgenden Ausdrücken entspricht: "EUR 15 million", "USD 37 million" und "GBP 5 million". Beim ersten Versuch sind Sie möglicherweise geneigt, "EUR|USD|GBP \d{1,} million" zu schreiben. Dies wird den Zweck jedoch nicht erfüllen, da nur den folgenden Zeichenfolgen entsprochen wird: "EUR", "USD" und "GBP [eine natürliche Zahl] million". Sie müssen die Alternativen im Regex gruppieren: "(EUR|USD|GBP) \d{1,} million", wobei "EUR|USD|GBP" entweder "EUR" oder "USD" oder "GBP" und "\d{1,}" eine natürliche Zahl ab 0 sein kann.
Ersetzen und neu anordnen
Für die Segmentierung werden in memoQ nur Regexe verwendet, um Mustern im Text des Übersetzungsdokuments zu entsprechen. Für Auto-Übersetzungsregeln wird auch eine andere wichtige Regex-Funktion verwendet, die mit Gruppen zu tun hat: Ersetzen und Neuanordnen von Teilen des zutreffenden Texts.
- Ersetzen eines zutreffenden Texts durch eine einzelne Zeichenfolge:
Sie haben bereits im Abschnitt "Testen ..." dieser Seite eine mögliche Verwendung für das Ersetzen kennengelernt. Dort wurde die eher einfache Regel für die Reihenfolge beim Ersetzen mit "x" definiert, um einen Regex-Treffer zu Testzwecken durch den Buchstaben "x" zu ersetzen.
- Neuanordnen und/oder Ersetzen von Teilen des zutreffenden Texts:
Hier müssen Sie alle Teile des Regex, auf die Sie verweisen möchten, in Klammerpaaren gruppieren. Der in jedem Klammerpaar eingeschlossene Treffer wird in memoQ gespeichert und bekommt eine Nummer zugewiesen, beginnend bei 1. Beim Schreiben der Regel für die Reihenfolge beim Ersetzen können Sie auf diese gespeicherten Teilzeichenfolgen durch "$1", "$2" usw. verweisen – in der Reihenfolge, in der die öffnende Klammer im Regex erscheint.
Im Fall des vorherigen Regex-Beispiels müssen Sie auch "\d{1,}" in Klammern setzen, um die Neuanordnung dieser Währungen und ihrer Werte zu ermöglichen: "(EUR|USD|GBP) (\d{1,}) million". In der Regel für die Reihenfolge beim Ersetzen können Sie auf "EUR|USD|GBP" durch "$1" und auf "\d{1,}" durch "$2" verweisen. Wenn Sie ihre Reihenfolge ändern möchten, könnte die Regel für die Reihenfolge beim Ersetzen "$2 Millionen $1" lauten.
memoQ-Erweiterungen
Wenn Sie Tags mit regulären Ausdrücken suchen möchten, können Sie drei spezielle Escape-Sequenzen verwenden:
- \tag entspricht allen Tags.
- \itag entspricht einem Inline-Tag (das in einem Siebeneck oder Sechseck angezeigt wird, z. B. .
- \mtag entspricht einem memoQ-Tag (das im Text in {geschweiften Klammern} angezeigt wird).
Da Tags in der Regel mit dem Text davor oder danach verbunden sind, empfiehlt es sich, sie in Klammern "()" zu setzen, wenn Sie nach einer Kombination aus Text und Tags suchen. Beispiel: "(\itag)int" entspricht Inline-Tags (öffnende, schließende oder leere Tags), auf die Wörter wie "integriert", "interessant" oder "international" folgen.
Benutzerdefinierte Listen
Zum Zwecke der Segmentierung und der Definition von Auto-Übersetzungsregeln ist es oft hilfreich, mit Listen von Wörtern zu arbeiten – Abkürzungen, Namen von Monaten, Währungen usw. Theoretisch wäre es möglich, diese Wörter gruppiert als Alternativen in den regulären Ausdrücken aufzulisten, wie Sie im vorherigen Abschnitt gesehen haben. Dies würde aber zu sehr komplizierten und schwer zu verwaltenden Regexen führen. Daher wird in memoQ eine spezielle Erweiterung für reguläre Ausdrücke eingeführt: benutzerdefinierte Listen.
Listen mit Wörtern, die in regulären Ausdrücken verwendet werden, können auf der Registerkarte Benutzerdefinierte Listen des Dialogfelds für Segmentierungsregeln oder des Dialogfelds für Auto-Übersetzungsregeln oder auf der Registerkarte Übersetzungspaare des Dialogfelds für Auto-Translatables definiert werden.
- Die benutzerdefinierten Listen auf der Registerkarte Benutzerdefinierte Listen des Dialogfelds für Segmentierungsregeln sollten Zeichen und Abkürzungen enthalten, die für die Segmentierung wichtig sind (z. B. ".", "!", "e.g.").
- Die benutzerdefinierten Listen auf der Registerkarte Benutzerdefinierte Listen des Dialogfelds für Auto-Translatables sollten Wörter enthalten, die dieselbe ausgangs- und zielsprachliche Form haben (z. B. "€", "$").
- Die benutzerdefinierten Listen auf der Registerkarte Übersetzungspaare des Dialogfelds für Auto-Translatables sollten ausgangssprachliche Wörter mit ihren zielsprachlichen Entsprechungen enthalten (bei Englisch-Deutsch-Projekten sollte z. B. "January" mit "Januar" übersetzt werden, "February" mit "Februar" usw.).
Der Name einer benutzerdefinierte Liste muss immer mit einem Nummernzeichen ("#") beginnen und enden. Die Wörter, die eine benutzerdefinierte Liste bilden, werden immer als Nur-Text interpretiert, d. h., Zeichen werden nicht als Meta-Zeichen mit besonderer Bedeutung behandelt.
Hinweis: Für Segmentierungsregeln ist in memoQ ein weiteres besonderes Element definiert: "#!#". Diese Erweiterung hat keinerlei Auswirkungen auf den Regex-Abgleich. Stattdessen wird in memoQ an der angegebenen Position ein Segmentumbruch eingeführt, wenn der Ausdruck dem Text im importierten Dokument entspricht.
Beispiel für die Verwendung der benutzerdefinierten Listen der Registerkarte Benutzerdefinierte Listen des Dialogfelds Auto-Übersetzungsregeln:
Sie möchten, dass in memoQ im Bereich Ergebnisse "15 Millionen EUR" für jedes Auftreten von "EUR 15 million" und "37 Millionen USD" für "USD 37 million" zurückgegeben wird. Erstellen Sie auf der Registerkarte Benutzerdefinierte Listen eine benutzerdefinierte Liste mit dem Namen "#currency#", die "EUR", "USD" und "GBP" enthält.
Erstellen Sie jetzt den Regex "(#currency#) (\d{1,}) million" (entspricht "(EUR|USD|GBP) (\d{1,}) million"), für den die Regel für die Reihenfolge beim Ersetzen "$2 Millionen $1" lauten könnte. Die Vorschau des obigen Regex und der Regel für die Reihenfolge beim Ersetzen ergibt folgendes Ergebnis:
Übersetzungspaare
Sie möchten, dass in memoQ im Bereich Ergebnisse "15 Millionen Euro" für jedes Auftreten von "EUR 15 million" und "37 Millionen Dollar" für "USD 37 million" zurückgegeben wird. Erstellen Sie auf der Registerkarte Übersetzungspaare eine benutzerdefinierte Liste mit dem Namen "#currency2#", die die folgenden Übersetzungspaare enthält: "EUR" – "Euro", "USD" – "Dollar" und "GBP" – "Pfund".
Hinweis: Der Name für die Liste der Übersetzungspaare darf nicht mit dem Namen unter Benutzerdefinierte Listen identisch sein.
Erstellen Sie jetzt den Regex "(#currency2#) (\d{1,}) million", für den die Regel für die Reihenfolge beim Ersetzen "$2 Millionen $1" lauten könnte. Die Vorschau des obigen Regex und der Regel für die Reihenfolge beim Ersetzen ergibt folgendes Ergebnis: