Einzelne Zeilen mit bestimmter Zeichenfolge aus Multiline Feld löschen

Aus dem Lyrics Feld möchte ich bestimmte Zeilen löschen, z.B.:

Aus

[ti:Four Letter Word]
[ar:Beady Eye]
[by:龙战天下]
[offset:-100]

[00:00.00]Beady Eye - Four Letter Word
[00:03.62][00:10.73][00:17.37][00:30.66][00:37.29][00:43.89][00:49.95][00:59.39][01:15.98][01:58.25][02:05.21][02:11.97][02:18.29][02:27.57][02:44.13][02:53.60][03:10.10][03:16.63][03:23.61][03:29.76] 
[00:05.79]Lyrics: Liam Gallagher, Gem Archer, Andy Bell
[00:07.80]Composer: Andy Bell, Gem Archer, Liam Gallagher
[00:13.43]lrc by 龙战天下QQ393398507
[00:26.87]Sleepwalk away the life
[00:28.38]If that turns you on
[00:33.35]It's only a moment
[00:34.51]Walk away and it's gone
[00:39.25]It's about time

soll

[ti:Four Letter Word]
[ar:Beady Eye]
[offset:-100]

[00:00.00]Beady Eye - Four Letter Word
[00:03.62][00:10.73][00:17.37][00:30.66][00:37.29][00:43.89][00:49.95][00:59.39][01:15.98][01:58.25][02:05.21][02:11.97][02:18.29][02:27.57][02:44.13][02:53.60][03:10.10][03:16.63][03:23.61][03:29.76] 
[00:05.79]Lyrics: Liam Gallagher, Gem Archer, Andy Bell
[00:07.80]Composer: Andy Bell, Gem Archer, Liam Gallagher
[00:26.87]Sleepwalk away the life
[00:28.38]If that turns you on
[00:33.35]It's only a moment
[00:34.51]Walk away and it's gone
[00:39.25]It's about time

werden, also die Zeilen

[by:龙战天下]

und

[00:13.43]lrc by 龙战天下QQ393398507

sollen entfernt werden.

Ich hab folgendes versucht:

$regexp(%lyrics%,'.(by:|lrc by).\r\n',)

Funktioniert aber nicht, weil damit jede Zeile bis auf die letzte entfernt wird. Weiß jemand, wo der Fehler liegt?

Ich hab es mit regexr.com getestet, dort funktioniert es, wenn ich \r weglasse:

Und wenn du
Suchen (.).(by:|lrc by).\r\n(.)
Ersetzen $1$2
probierst?

Dann bleibt nur noch das übrig:

[ti:Four Letter Word]
[ar:Beady Eye]
[by:龙战天下]
[offset:-100]

[00:00.00]Beady Eye - Four Letter Word
[00:03.62][00:10.73][00:17.37][00:30.66][00:37.29][00:43.89][00:49.95][00:59.39][01:15.98][01:58.25][02:05.21][02:11.97][02:18.29][02:27.57][02:44.13][02:53.60][03:10.10][03:16.63][03:23.61][03:29.76] 
[00:05.79]Lyrics: Liam Gallagher, Gem Archer, Andy Bell
[00:07.80]Composer: Andy Bell, Gem Archer, Liam Gallagher
[00:13.43]lrc by
QUOTE (seppl @ Jul 2 2014, 12:03) <{POST_SNAPBACK}>
Dann bleibt nur noch das übrig:
[ti:Four Letter Word]
[ar:Beady Eye]
[by:龙战天下]
[offset:-100]

[00:00.00]Beady Eye - Four Letter Word
[00:03.62][00:10.73][00:17.37][00:30.66][00:37.29][00:43.89][00:49.95][00:59.39][01:15.98][01:58.25][02:05.21][02:11.97][02:18.29][02:27.57][02:44.13][02:53.60][03:10.10][03:16.63][03:23.61][03:29.76] 
[00:05.79]Lyrics: Liam Gallagher, Gem Archer, Andy Bell
[00:07.80]Composer: Andy Bell, Gem Archer, Liam Gallagher
[00:13.43]lrc by<!--QuoteEnd--></div><!--QuoteEEnd-->

Dann probier mal für das erste
$regexp(%comment%,'[by.*\r\n([off)',$1)
.

Da lrc Keinen vernünftigen Begrenzer am Ende hat, wird das schwierig. Oder ist das immer die 4. oder 5. Zeile von hinten?

Das funktioniert, allerdings möchte ich die Zeile nur anhand der darin vorkommenden Zeichen entfernen, ohne Bezug auf die nächste Zeile.

Nein, die Position der Zeile sollte egal sein.

Ich habe jetzt zum Testen diesen Text genommen:

abc def
ghi jkl
mno pqr
stu vwx
yz

Ich möchte die Zeile "mno pqr" anhand der Zeichenkette "no" erkennen und dann diese Zeile löschen.

Das Erkennen der Zeile müsste entweder so:

.no.\n

oder so:

^.no.$\n/m

funktionieren, zumindest klappt das in mehreren Regex-Testern so.

Nur in mp3tag sehen die Ergebnisse anders aus:

$regexp(%lyrics%,.no.\n,)
Ergebnis:
yz

$regexp(%lyrics%,^.no.$\n/m,)
Ergebnis:
abc def
ghi jkl
mno pqr
stu vwx
yz

$regexp(%lyrics%,\n.no.\n,)
Ergebnis:
abc def
yz

Der reguläre Ausdruck umfasst in mp3tag also anscheinend nicht nur die "nächstgelegenen" linefeeds, sondern den ganzen Bereich vom ersten bis zum letzten linefeed des Textes.
Gibt es also einen Ausdruck, mit dem ich sagen kann:
Finde "no", und zusätzlich alle Zeichen vorher bis zum vorherigen Zeilenumbruch und alle Zeichen danach bis zum nächsten Zeilenumbruch?

Wie gesagt, mit Regex-Testern wie http://www.regexr.com/ funktioniert das ganz einfach. Sind in mp3tag vielleicht irgendwelche flags standardmäßg aktiviert, die ich noch deaktivieren muss?

Das funktioniert dann nicht.
...

MP3tags reguläre Ausdrücke sind gierig. Und deshalb versuchen die einen so großen Bereich zu nehmen, wie möglich.
Um den einzugrenzen, müsstest du ein eindeutiges Muster definieren. Das scheint nicht zu gehen, da nicht klar ist, welche Daten das Suchmuster begrenzen.
Wenn deine Tester sich umschalten lassen auf "gierig", sollte es auch dort nicht mehr funktionieren.

Vielleicht ...

$regexp(%TEST%,'(\r*\n)*[^\r\n]*(item)[^\r\n]*(\r*\n)*','\r\n')
                             <!--coloro:#000000--><span style="color:#000000"><!--/coloro-->----<!--colorc--></span><!--/colorc--></b><!--fontc--></span><!--/fontc--><!--sizec--></span><!--/sizec-->

DD.20140703.1122.CEST

Vielen Dank, Detlev, das funktioniert tatsächlich! Ich weiß nicht wie, aber es funktioniert :smiley:
Und mit (item1|item2|item3) lässt sich ein Feld nach verschiedenen Ausdrücken durchsuchen und diese Zeilen werden dann entfernt. Perfekt :slight_smile: