Frage Textmate: Regulärer Ausdruck zum Ersetzen von Übereinstimmungen, die den Fall beibehalten?


Wie kann ich eine einzelne Suche / Ersetzen verwenden, um alle Wörter zu ersetzen town mit village den Fall des ersten Buchstabens in diesem Satz zu bewahren:

Towns are small cities. I live in a town.

enter image description here


3
2017-11-04 17:49


Ursprung


Uncheck den Ignorierfall und mehrere Ersetzungen? - Zoredache


Antworten:


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

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

  • \b = Wortgrenze
  • (?:) = nicht einfangende Gruppe
  • (?1:\u) = Wenn die Gruppe 1 erfasst wurde, wandeln Sie das nächste Zeichen in Großbuchstaben um

7
2017-11-06 19:00



Das ist viel schlauer als meins, def den Weg zu gehen - kine
Wenn ich dir mehr als eine Aufzählung geben könnte, würde ich es tun. - cwd
Sehr cool. Ist das reguläre Perl Regexp Syntax? - Daniel Beck♦
@DanielBeck Nein, TextMate verwendet die Onigurum Bibliothek. Perl 5 scheint zu unterstützen \u, aber nicht (?1:). - user495470
Danke für den Link (es erfordert www. obwohl)! - Daniel Beck♦


Ich bin gerade auf meiner Arbeitsmaschine, also kein TextMate hier für mich zu testen, aber ich denke das Macht Tun Sie, was Sie wollen:

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

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

Erläuterung:

Das Suchmuster sucht nach den Buchstaben own vorausgegangen von a T oder ein tund erfasst sie dann $1 und $2 beziehungsweise. Das (?<!T) innerhalb der zweiten Aufnahme sorgt dafür, dass Sie nicht beide gleichzeitig bekommen (wie Tt zusammen), so unwahrscheinlich wie wahrscheinlich ist, und die (?<! ) Bit bedeutet das own Es kann kein Leerzeichen vorangestellt werden - dies sollte verhindern, dass es mit dem Wort übereinstimmt own von selbst. Das \b auf jeder Seite bedeutet, dass es nur das ganze Wort zusammenbringen sollte (sonst wird es Dinge wie passen townies und chown). Zuletzt, die (s)? Teil fängt ein Finale ein s (wenn es existiert) zu $3.

Das Ersetzen-Muster verwendet bedingte Einfügungen um zu bestimmen, wofür der Text ersetzt werden soll. Im Pseudocode sagt der Ersetzungsstring grundsätzlich:

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 sind oder ein enthalten s)

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


2
2017-11-06 16:43



Das löscht \bown\b wo der erste \b ist kein Raum. - user495470
Ah. Ich schätze, das passiert, wenn man die Dinge nicht testet :( - kine