String Parsen und auf eigenes Muster anwenden


w00t

Grünschnabel
#1
Also ....

Ich lese eine Liste von Strings ein und vergleiche diese Miteinander.
Beispiel:
  1. AA.A.A001.BBB.ab.cde
  2. AA.A.A002.CC.ab.cde
  3. AA.A.A003.DDDD.ab.cde


Daraus baue ich mir eine ArrayList mit einer erweiterten Version von Character (CharacterEx). Dies sind dann so aus:
Code:
AA.A.A00X.Y.ab.cde
Das X bedeutet das hier eine Zahl steht, die Variabel ist.
Das Y bedeutet das hier ein String steht, der Variabel ist.

Meine Klasse CharacterEx speichert die Position innerhalb des Originalstrings sowie den Typen.
Typen:
  1. Unbekannt
  2. String
  3. Integer


Um den Variablen String in der Mitte zu finden, gehe ich meine Ausgangsstrings von vorne und von hinten durch und vergleiche. Zum Schluss werden die Ergebnisse zusammengefasst.

Nun hat man die Möglichkeit ein Muster festzulegen. Hierfür folgende Schreibweise:
Code:
[HS].[HIS].[S].[D]
[HS] = Fester String (kann alles enthalten, auch zahlen)
[HIS] = Fester String, der VARIABLE! Zahlen enthalten kann
[S] = Variabler String
[D] = Dummy (alles andere)
Nun muss das ganze auf den String gematcht werden, so das folgendes Ergebnis herauskommt:
Code:
AA.A.A00X.Y.ab.cde
Code:
[HS] = AA.A
.
[HIS] = A00X
.
[S] = Y
.
[D] = ab.cde
Nun gäbe es eine Klasse, ich nenne sie einmal StringEx, die die Informationen speichert, und dies alles für jedes Element in der Liste:
List:
Code:
-------------
Type: [HS]
Value: AA.A
Position: 0, 3
Index: 0
Alias: [HS|1]
-------------
Type: divider
Value: .
Position: 4,4
Index: 1
-------------
Type: [HIS]
Value: A00X
Position: 5,9
Index: 2
Alias: [HIS|1]
-------------
Type: divider
Value: .
Position: 10,10
Index: 3
-------------
Type: [S]
Value: Y
Position: 11,11
Index: 4
Alias: [S|1]
-------------
Type: divider
Value: .
Position: 12,12
Index: 5
-------------
Type: [D]
Value: ab.cde
Position: 13,18
Index: 6
Alias: [D|1]
-------------
Sollte ein Element öfter vorkommen (z.B. [HIS], wäre der Alias für das zweite Element [HIS|2]).

Meine Idee war nun eine Art Parser zu schreiben, der ähnlich wie Regex funktioniert, nur halt auf meinen Fall anwendbar ist. Allerdings fehlt mir gerade die Vorstellung wie ich das angehen soll.

Aktuell spiele ich mit folgendem Gedanken:
Das Ursprungsmuster in eine Map packen:
Code:
map.put("[HS]")
map.put(".")
...
Dann gehe ich meine Liste von CharacterEx durch und .... tja. Hier fehlt mir dann irgendwie eine Idee wie ich das umsetzten kann. Es ist auch NICHT zwingend erforderlich, das zwischen den einzelnen Mustern ein "." ist. es könnte auch:
Code:
[HS][HIS][S][D]
sein, der dann auf folgendes matcht, das ist also variabel:
Code:
[HS] = AA.A.
[HIS] = A00X.
[S] = Y
[D] = .ab.cde
Was ich hier NICHT erwarte: Eine fertige Lösung von jemandem. FALLS es so etwas in der Art allerdings schon gibt, gerne her damit! Auch Codebeispiele usw. wären hilfreich. Aber im Endeffekt freue ich mich über Ideen die mich weiter bringen, Stichwörter usw.



Dies ist ein Crosspost, da in einem anderen Forum leider keine Antwort bisher gefunden wurde:
http://www.java-forum.org/allgemein...arsen-eigenes-muster-anwenden-kein-regex.html

Sollte es hier oder im anderen Forum antworten geben, führe ich die natürlich zusammen, so das niemand doppelte Arbeit hat ;-)
 

sheel

I love Asm
#2
Hi

an Antworten solls nicht scheitern :)
...nur bin ich grad etwas verwirrt, also fang ich einmal mit dem ersten Teil allein an.
Also, wie man zB.
Code:
AA.A.A001.BBB.ab.cde
AA.A.A002.CC.ab.cde
AA.A.A003.DDDD.ab.cde
zusammenfasst zu einem Array von CharacterEx´es, die entweder den fixen Wert darstellen, oder eben "Platzhalter für Ziffern", "Platzhalter für Strings" oder "Platzhalter für Unbekannt". Richtig? (Ich hoffe, die speichern das so, dass es nicht mit den Buchstaben X und Y verwechselt werden kann?).

Bestehen die Strings immer nur aus lateinischen Buchstaben, Ziffern, und Punkten, oder kann da alles mögliche andere drin sein? (Könnte evt. später helfen, das zu wissen).

Kann ein Zahlenplatzhalter auch mehrere Ziffern haben, oder brauchts einen Platzhalter pro Ziffer? (geht aus dem Beispiel nicht hervor). Können die Stringplatzhalter auch auf Zahlen zutreffen? (wenn ja, wie wird entschieden was es ist)? Können die Platzhalter auch über Punktgrenzen gehen?

PS:
Um den Variablen String in der Mitte zu finden, gehe ich meine Ausgangsstrings von vorne und von hinten durch und vergleiche. Zum Schluss werden die Ergebnisse zusammengefasst.
Wenns mehrere variable Strings gibt funktioniert das eher nicht so. Aber mehr dazu später.
Und was genau wird zusammengefasst?
 

w00t

Grünschnabel
#3
Hallo,

wenigstens einer der Nachfragt wenn was unklar ist ;-)

Also:
(Ich hoffe, die speichern das so, dass es nicht mit den Buchstaben X und Y verwechselt werden kann?
  1. AA.A.A00X.Y.ab.cde
X und Y sind hier nur Platzhalter. Bei mir in der Debugausgabe ist der Wert NULL.
Also eig:
AA.A.A00null.null.ab.cde

Hatte versucht eine gute Lesbarkeit zum Verständnis herzustellen.

Bestehen die Strings immer nur aus lateinischen Buchstaben, Ziffern, und Punkten, oder kann da alles mögliche andere drin sein? (Könnte evt. später helfen, das zu wissen).
Aktuell ist es geplant Dateinamen einzulesen die dann die Strings sind, also alles was als Zeichen im Dateinamen verwendet werden kann. Also eig ist die Antwort "Ja, nur lateinische Buchstaben, Ziffern, Punkte und weitere Sonderzeichen die in Dateinamen erlaubt sind (-_+ usw)".

Kann ein Zahlenplatzhalter auch mehrere Ziffern haben, oder brauchts einen Platzhalter pro Ziffer? (geht aus dem Beispiel nciht ganz hervor)
Ein Zahlenplatzhalter ist immer nur ein Zeichen.

Können die Stringplatzhalter auch auf Zahlen zutreffen?
  • AA.A.A001.BBB.ab.cde
  • AA.A.A002.CC.ab.cde
  • AA.A.A003.DDDD.ab.cde
BBB / CC / DDDD könnten auch Zahlen enthalten, werden beim Zusammenfassen in diesem Fall aber eh auf NULL gesetzt, da dies ein Variabler String wird.

AA.A.A könnte auch Zahlen enthalten.


PS: Wenns mehrere variable Strings gibt funktioniert das eher nicht so. Aber mehr dazu später.
Ja, da hast Du recht, evtl hast Du ja eine bessere Idee. Gerne!

Können die Platzhalter auch über Punktgrenzen gehen?
Das Problem bei meinem Beispiel ist ja, das es mehrere Punkte sein könnten ;)
Aber sieh Dir vielleicht das Ziel an, dann wird das vielleicht klarer was ich vorhabe und ob ich evtl eh einen großen Denkfehler habe.


Vielleicht sollte ich einmal ergänzen was mein Ziel ist.

Eigentlich geht es um Dateinamen die Serien abbilden.
Beispiel (gutes Beispiel, weil es eig alles enthält):
2.Broke.Girls.S04E01.Das.Reality.Problem.GERMAN.DL.DUBBED.720p.WebHD.x264-TVP
2.Broke.Girls.S04E02.Der.Bio.Club.GERMAN.DL.DUBBED.720p.WebHD.x264-TVP
2.Broke.Girls.S04E03.Von.Fischen.und.Baeren.GERMAN.DL.DUBBED.720p.WebHD.x264-TVP
2.Broke.Girls.S04E04.Das.verstrickte.Fahrrad.GERMAN.DL.DUBBED.720p.WebHD.x264-TVP

Das Ziel ist es, die Dateien (halb-)automatisch umzubenennen. Halb deshalb, da man ja ein Muster ([HIS [S ]usw.) angeben muss.
Ergebnis hier wäre also:
2.Broke.Girls.S04E0*.*.GERMAN.DL.DUBBED.720p.WebHD.x264-TVP
(Als Platzhalter diesmal *, anstatt X und Y, zur besseren Lesbarkei.)
Damit ist das geplante Ergebnis bei dem Muster [HS].[HIS].[S ].[D]:
    • [HS] = 2.Broke.Girls
    • .
    • [HIS] = S04E0*
    • .
    • [S ] = *
    • .
    • [D] = GERMAN.DL.DUBBED.720p.WebHD.x264-TVP
Nun ist geplant das man ein ein Eingangs- und ein Ausgangsmuster hat:
Eingangsmuster: [HS].[HIS].[S ].[D]
Ausgangsmuster: [HS] - [HIS] - [S ]
Damit wäre dann eine Halbautomatische Umbenennung möglich:
2.Broke.Girls - S04E0* - *
Was dann folgendes ergeben würde:
2.Broke.Girls - S04E01 - Das.Reality.Problem
2.Broke.Girls - S04E02 - Der.Bio.Club


Btw... den Code den ich bisher habe ist hier zu sehen:
http://git.io/vUUyd

Sollten nun noch Fragen offen sein, her damit ;)
Ich komm einfach nicht sinnvoll weiter. Gedankensperre^^
 
Zuletzt bearbeitet:

w00t

Grünschnabel
#4
Im Java-Forum wurde nun noch einiges vorgeschlagen und nachgefragt. Daraufhin hier einmal ein Link zu meinem exakten Beitrag wo ich nochmal einiges erklärt habe.
http://www.java-forum.org/allgemein...enden-kein-regex-post1057596.html#post1057596

Während ich das schrieb, fragte ich mich, ob nicht genau das ein Teil der Lösung ist. Ich baue also einen echten String aus meiner Charliste, wo ich die Variablen Sachen mit Festen ersetzte. So das man dann Regex nutzen könnte... hmmm. Spricht da irgendwas gegen das auszuprobieren?