Kate Regex: Nur das letzte Vorkommen matchen

CyborgBeta

Lt. Commander
Registriert
Jan. 2021
BeitrÀge
1.825
Hi, ich schon wieder mit einer neuen Frage 🙃 (hoffe, das ist die richtige Forenkategorie...)

Ich hab folgende Textdatei:

blaablaablaablaa - blaablaa-12n
blaablaablaa-n3n
blaablaa - blaablaa-4nn5
blaablaablaablaa-nn0
blaablaablaa
...

Es sind also 0 bis 2 Minuszeichen vorhanden. Ich möchte jetzt, wenn es 1 bis 2 Minuszeichen in einer Zeile gibt, das letzte Minuszeichen und alles danach durch "" ersetzen (also löschen).

Gibt es in der Kate-Syntax einen Reluctant-Mode?

ZunĂ€chst hab ich mir mit: (\-[^\-]{1,5}$) beholfen, das heißt, es muss genau ein - geben, und danach zwischen 1 und 5 Nicht-Minuszeichen...

Das funktioniert freilich nicht bei zum Beispiel "blaablaa - bla-4nn5555"... weil "4nn5555" lÀnger als 5 ist. :(

Danke schon mal.
 
Keine Ahnung, ob Kate eine eigene Regex-Syntax hat, aber mit dem $-Operator kannst du ausgehend vom String-Ende ein Regex anwenden.
Bei dir z.B. dann ...s.u... und der Replace dazu wÀre einfach nur $1.

E: Da hat ein Stern gefehlt.
E2: Es hat noch ein Stern gefehlt...
E3: Sorry :D das Forum macht komische Dinge und auch im Codeblock funktioniert es nicht

Code:
(.*)-.*?$
ErgÀnzung ()

So jetzt aber
 
@burglar225 verwende bitte:

Code:
`Dein regulÀrer Ausdruck...`

Sonst kann das keiner lesen.
 
Sollte doch jetzt passen oder? Im Codeblock wird es jedenfalls wie von mir beabsichtigt dargestellt.
Übrigens hat es im Inline-Codeblock auch nicht funktioniert, sondern ausschließlich im "normalen" Codeblock. Etwas seltsam.
 
@burglar225
Dein Ausdruck wĂŒrde wohl auch Zeilen mit nur einem Minus trimmen. Davon abgesehen hatte ich den gleichen Gedanken.
Vor dem zweiten Minus greedy und danach lazy. Statt den hinteren Teil zu ersetzen, eben nur den Vorderen nehmen.
Code:
(^.*-.*)(-.*?$)

Edit:
Sollte wohl auch genau das machen was @burglar225 geschrieben hat. =)
 
  • GefĂ€llt mir
Reaktionen: CyborgBeta und burglar225
Stimmt, die Anforderung hatte ich nicht berĂŒcksichtigt. Danke fĂŒr die ErgĂ€nzung.
 
burglar225 schrieb:
Dabei gibt es ein Problem: Es muss nach dem Minus mindestens ein weiteres Zeichen geben, und es soll nicht matchen, wenn es insgesamt nur ein Minus gibt, das "in der Mitte steht".
 
Sorry, muss jetzt erst weg. Ich werde das nachher mal ausprobieren...

Eigentlich habe ich zwei unterschiedliche Anforderungen:

  • Wenn es nur ein - gibt, soll geschaut werden, ob das danach nicht lĂ€nger als zum Beispiel 5 ist
  • Wenn es genau zwei - gibt, dann ist die LĂ€nge nach dem letzten - egal
  • (Wenn es kein - gibt, dann soll nichts geschehen)

Das riecht nach einer Fallunterscheidung. 🙊
 
Ich bin gerade auch unterwegs und am Handy. Ich schau es mir spÀter nochmal genauer an und melde mich.
ErgÀnzung ()

CyborgBeta schrieb:
  • Wenn es nur ein - gibt, soll geschaut werden, ob das danach nicht lĂ€nger als zum Beispiel 5 ist
Was soll hier jeweils passieren bei <=5 und >5? Die Info fehlt hier noch.
ErgÀnzung ()

Also erstmal wĂŒrde ich das Problem in zwei Teilprobleme aufteilen. Beides in einem Regex lösen wĂ€re sicher möglich, macht das ganze aber viel zu kompliziert.
FĂŒr deine erste Anforderung (ausgehend davon, dass bei >5 Zeichen hinter dem - entfernt werden soll): https://regex101.com/r/9OnlA6/1
FĂŒr die zweite Anforderung: https://regex101.com/r/0FZrN5/1
 
Zuletzt bearbeitet:
Ich denke, die Syntax ist hier https://docs.kde.org/stable5/en/kate/katepart/regular-expressions.html und hier https://docs.kde.org/stable5/en/kate/katepart/regex-patterns.html beschrieben.

Und hier habe ich gerade etwas Interessantes gefunden: https://docs.kde.org/stable5/en/kate/katepart/quantifiers.html#idm10310

Greed

When using quantifiers with no maximum, regular expressions defaults to match as much of the searched string as possible, commonly known as greedy behavior.

Modern regular expression software provides the means of “turning off greediness”, though in a graphical environment it is up to the interface to provide you with access to this feature. For example a search dialog providing a regular expression search could have a check box labeled “Minimal matching” as well as it ought to indicate if greediness is the default behavior.

Gier

Bei der Verwendung von Quantifizierern ohne Maximalwert passen regulĂ€re AusdrĂŒcke standardmĂ€ĂŸig so viel wie möglich an die gesuchte Zeichenkette an, was allgemein als gieriges Verhalten bekannt ist.

Moderne Software fĂŒr regulĂ€re AusdrĂŒcke bietet die Möglichkeit, die "Gier" abzuschalten. In einer grafischen Umgebung liegt es jedoch an der BenutzeroberflĂ€che, Ihnen den Zugriff auf diese Funktion zu ermöglichen. Ein Suchdialog, der eine Suche mit regulĂ€ren AusdrĂŒcken anbietet, könnte zum Beispiel ein KontrollkĂ€stchen mit der Aufschrift "Minimale Übereinstimmung" haben und sollte auch anzeigen, ob Gier das Standardverhalten ist.

Übersetzt mit www.DeepL.com/Translator (kostenlose Version)

Das heißt, ganz vereinfacht gesagt, dass ein zögerliches Verhalten (reluctant) nicht möglich ist in Katepart...
---

So viel erst mal dazu... Sagen wir, ich hĂ€tte einen ---Matcher und einen --Matcher. Wenn ich den ---Matcher zuerst anwende, dann wĂŒrde ein - entfernt und der --Matcher kĂ€me durcheinander.

Wenn ich den --Matcher zuerst anwende und ein - entfernt wĂŒrde, dann wĂŒrde der ---Matcher nix mehr finden.

Ich mĂŒsste quasi die Anzahl der - zĂ€hlen, und davon abhĂ€ngig einen der Matcher anwenden...

... Oder sieht jemand eine "allgemeinste Substitution"?
 
Also laut regex101 funktionert das eine Regex auch ohne den lazy-Operator, sollte also kein Problem sein. Das andere kommt ganz ohne aus.
Abgesehen davon, nimm halt fĂŒr diesen einen Task einen anderen Texteditor oder noch einfacher grep. Das unterstĂŒtzt den lazy-Operator.
 
  • GefĂ€llt mir
Reaktionen: CyborgBeta
Ok, Danke erst mal...
 
  • GefĂ€llt mir
Reaktionen: burglar225
Ein bis zwei Minuszeichen in einer Zeile? Naja, dann veranker doch die gesamte Zeile. /shrug

Perl:
pattern = /^([^-])*(-)([^-])*-[^-]*$/
replace = "$1$2$3"
wobei $1 = bis zum ersten Minus, $2 dieses Minus (einfach zur Übernahme ins Ergebnis, kann man natĂŒrlich auch hart reincodieren) und $3 der Teil vom ersten Minus bis unmittelbar vorm zweiten Minus ist.

Kein Aufriß ĂŒber irgendwelches greedy oder nongreedy oder sonstwas erforderlich. Einfach die Zeile matchen. Ist ja nicht mal Teil eines Kontexts, sondern buchstĂ€blich der gesamte Input (außer fĂŒr Multiline).

PS. Anker haben wie alle "non-char Matches" nix im Klammerausdruck zu suchen:
^(.*) anstelle von (^.*)
Dasselbe auch mit $, \< und \>, \b und so weiter.
 
Hi, das gefÀllt mir sehr gut. :) Danke dir zu spÀter Stunde.

Zwei Fragen habe ich dazu... Ja, Kate wendet immer nur eine Zeile als Input an, und es gibt keinen zeilenĂŒbergreifenden Kontext.

1. Gibt es ein Oder (zum Beispiel |)?
2. (-)([^-])*-[^-]* den Part raff ich nicht ganz... MĂŒsste es nicht (-)? lauten... also ein optionales in der Mitte?

Danke vorab fĂŒr die MĂŒh.
 
Den Oder-Operator gibt es und das ist sogar das Pipe-Zeichen (|). Allerdings funktioniert das nur innerhalb einer Matching-Group.
 
  • GefĂ€llt mir
Reaktionen: CyborgBeta
ZurĂŒck
Oben