Textmate: regulärer Ausdruck zum Ersetzen von Übereinstimmungen, wobei Groß- / Kleinschreibung beibehalten wird?

4

Wie kann ich ein einzelnes Suchen / Ersetzen verwenden, um alle Wörter zu ersetzen? town mit village Beibehaltung des ersten Buchstabens in diesem Satz:

Towns are small cities. I live in a town.

enter image description here

cwd
quelle
2
Deaktivieren Sie den Ignorier-Fall und führen Sie mehrere Ersetzungen durch?
Zoredache

Antworten:

8

\b(?:(T)|t)own(s?)\b(?1:\u)village$2

(Und deaktivieren Sie Groß- / Kleinschreibung im Dialogfeld ignorieren)

  • \b = Wortgrenze
  • (?:) = nicht erfassende Gruppe
  • (?1:\u) = Wenn Gruppe 1 erfasst, wird das nächste Zeichen in Großbuchstaben umgewandelt
Lri
quelle
Das ist viel schlauer als meins, auf jeden Fall
kine
Wenn ich Ihnen mehr als eine Gegenstimme geben könnte, würde ich.
cwd
Sehr cool. Ist das reguläre Perl-Regex-Syntax?
Daniel Beck
1
@DanielBeck Nein, TextMate verwendet das Oniguruma Bibliothek. Perl 5 scheint zu unterstützen \u, aber nicht (?1:).
Lri
Danke für den Link www. obwohl)!
Daniel Beck
2

Ich bin gerade auf meiner Arbeitsmaschine, also kein TextMate hier, den ich testen kann, aber ich denke, das ist es könnte Tun Sie, was Sie wollen:

Find:     \b(T)?((?<!T)t)?(?<! )own(s)?\b
Replace:  (?1:Village)(?2:village)$3

(Deaktivieren Sie zuerst "Groß- / Kleinschreibung ignorieren".)

Erläuterung:

Das Suchmuster sucht nach den Buchstaben own vorangestellt von a T oder ein tund nimmt sie dann auf $1 und $2 beziehungsweise. Das (?<!T) Im zweiten Capture wird sichergestellt, dass Sie nicht beide gleichzeitig erhalten (z. B. Tt zusammen), so unwahrscheinlich das wahrscheinlich ist, und die (?<! ) Bit bedeutet das own Ein Leerzeichen darf nicht vorangestellt werden - dies sollte verhindern, dass es mit dem Wort übereinstimmt own von selbst. Das \b auf jeder Seite bedeutet, dass es nur dem ganzen Wort entsprechen sollte (ansonsten wird es mit Dingen wie übereinstimmen townies und chown ). Schließlich die (s)? Teil fängt ein Finale s (falls vorhanden) bis $3.

Das Ersetzungsmuster verwendet bedingte Einfügungen um zu bestimmen, durch was der Text ersetzt werden soll. Im Pseudocode sagt der Ersetzungsstring im Grunde:

if (the first capture [T] exists)  { replace the text by the word Village }
if (the second capture [t] exists) { replace the text by the word village }

(Und dann fügt es hinzu $3, die entweder leer sein oder ein s )

Es ist hässlich, aber ich denke, es wird wahrscheinlich für das Beispiel funktionieren, das Sie sowieso gegeben haben.

kine
quelle
1
Das löscht \bown\b wo der erste \b ist kein Leerzeichen.
Lri
Ah. Ich schätze, das passiert, wenn man nichts testet :(
kine