2016-03-19 10 views
4

Ich habe eine String-Ausgabe von einer sehr langen Reihe von Filmtiteln und Musik Albumtiteln.Wie würde ich Regex verwenden, um eine bestimmte Menge von Strings Java auszugeben?

z.B. [(Pixel Quality) (Year of Release) MovieTitle.ext,...... Albumname-artistname.ext]

heißt [(HD 1080p) (2015) Batman vs Superman.mov,........tearsinheavan-ericclapton.mp3,.......]

Ich versuche, die Filme und Musik auseinander mit Regex Ausdrücke zu identifizieren. Ein Film hat Pixelqualität, ein Veröffentlichungsdatum, einen Bewegungstitel und eine Erweiterung wie (.mov, .flv ... etc), während Musik einen Albumnamen gefolgt von - und den Künstlernamen mit einer Erweiterung wie (.mp3 ,. Aax .....). Die erwartete Ausgabe wäre (Pixel Quality) (Year of Release) MovieTitle.ext für einen Film und Albumname-artistname.ext für Musik.

Ich bin nicht vertraut mit Regex Ich weiß nur, wie einzelne Zeichen oder ein bestimmtes Wort übereinstimmen. Allerdings kann ich nicht die gesamte Pixelqualität, das Veröffentlichungsjahr und movietitle.ext ausgeben. Nur die spezifischen Wörter, die ich gefunden habe oder die einzelnen Zeichen.

Methode Ich habe versucht, die "Kategorien" zu finden.

public void FindPatterns() { 

     String patternFilms = ("REGEX PATTERN?"); 
     Pattern pattern = Pattern.compile(patternFilms); 

     for (String name : names) { 
      Matcher matcher = pattern.matcher(name); 

      while(matcher.find()){ 

       System.out.println(matcher.group()); 
      } 
     } 

    } 

UPDATE:

ich versucht habe mit dem regex Muster in meinem Code zu hantieren, und ich bekomme nichts als Syntaxfehler mich markiert werden fragen, die Token zu löschen, kann ich eine nicht finden Klar genug Beispiel für das, was ich versuche zu erreichen.

Nur wenn ich das Muster die ganze Zeit an den falschen Platz gesetzt habe, habe ich das Regex Muster in String pattern gesetzt und "REGEX PATTERN? ist nur ein Platzhalter, wo ich frage, ob das der richtige Ort ist Muster.

+0

Warum können Sie die Zeichenfolge durch Komma nicht geteilt ("")? – mks

+0

@mks es ist eine Java-Programmierübung für die Schule. Eine Einschränkung besteht darin, keine Methoden der String-Klasse zu verwenden. Ich konnte keine guten Beispiele finden, die mir helfen könnten, also habe ich versucht, hier zu fragen ... es hilft immer noch nicht wirklich. – LovesPie

Antwort

0

Auf der Java-Seite der Dinge, Ihr Code muss jede einzelne Gruppe als benannte oder indizierte Gruppe extrahieren. Das ist (relativ) der einfache Teil. Bevor Sie zu diesem Punkt kommen, klingt es so, als ob Sie Hilfe mit Ihrem Muster benötigen, also schauen wir uns das zuerst an.

Bauen Sie Ihre Regex Stück für Stück auf. Ein Tool, mit dem Sie Ihre Regex schnell iterieren können, ist nützlich. Ich mag https://regex101.com/.

Was Sie tun müssen, ist wählen Sie "übereinstimmende Gruppen" aus der Eingabe String. Sie möchten also alles zusammenfassen, was Sie wegwerfen können (Dinge wie Kommas und Klammern), sowie die Daten, die Sie extrahieren möchten. Für die Daten, die Sie extrahieren möchten, umgeben Sie die Regex für jedes dieser Daten in Klammern, um die Gruppe zu bezeichnen.

Ihre Eingabezeichenfolgen haben viele Zeichen, die innerhalb einer Regex eine besondere Bedeutung haben, wie [ und (. Wenn Sie sie also explizit abgleichen wollen, müssen sie "maskiert" werden. Beachten Sie auch, dass das Zeichen \ selbst ein Escape-Zeichen für eine Java-Zeichenfolge ist, wenn Sie Ihre Regex in Java übersetzen. Daher muss es auch mit einem anderen \ entkoppelt werden. So würde zum Beispiel eine Regex, die mit einem [ Zeichen übereinstimmt, wie \\[ definiert werden.

also zunächst die gesamte Eingangsanpassungs:

^.*$ 

Die ^ Zeichen „Anker“ sind, die „Beginn des Eingangs“ und „Endes des Eingangs“ jeweils bedeuten. Die . passt nur auf ein beliebiges Zeichen und die * entspricht dem vorherigen Token (beliebiges Zeichen) 0, 1 oder mehrmals (also alles).

In Regex 101 wird dies den gesamten Eingang hervorheben.

Die gesamte Zeichenfolge wird mit eckigen Klammern umgeben, können diejenigen, so passen, und daran erinnern, sie müssen maskiert werden:

^\[.*\]$ 

können nun beginnen, die einzelnen Komponenten zerbrechen. Die ersten beiden sind durch Klammern begrenzt, und wir erinnern uns Klammern entkommen müssen, können so Spiel (something) (something) something:

^\[\(.*\) \(.*\) .*\]$ 

nun wieder die ganze Eingabe sollte wieder hervorgehoben. Hier können Sie die beiden Stücke von Daten herausziehen wir sie umgebenden in Klammern nur identifiziert:

^\[\((.*)\) \((.*)\) .*\]$ 

Jetzt sollten Sie die Spiele hervorgehoben und gezeigt über auf der rechten Seite sehen. Erstellen Sie nun den Regex und ersetzen Sie den letzten .* durch spezifischere Übereinstimmungen.

Kommentar zu dieser Antwort, wenn Sie auf ein bestimmtes Problem stoßen!

0

Es sieht aus wie es eingeklammert ist und dann durch Komma getrennt, so etwas entlang der Linien von^[((. )) ((.?)), (. ), (.)] $

^entspricht dem Anfang der Zeile und $ entspricht dem Anfang der Zeile \ entkoppelt Zeichen, die spezielle regex-Bedeutung haben, wie [. Sie müssen [und (um Literale Klammern und Klammern zu entsprechen. (...) markiert eine Gruppe, so dass Sie es extrahieren können, wenn Sie eine Übereinstimmung erhalten. . * Ist nur null oder mehr Wiederholungen eines beliebigen Zeichens. Verwenden. + eine oder mehr Wiederholungen zu erhalten auch, fügen Sie „*“, wo Räume

ein Beispiel in Perl passen benötigt...

echo "(hd)(2015) Avatar.ext, Douchebagson.ext" | perl -pe "s/^\((.*)\) *\((.*)\) *(.*) *, *(.*)$/\1,\2,\3,\4/g" 
hd,2015,Avatar.ext,Douchebagson.ext 

Was für eine Substitution geschieht Wir ersetzen die Eingabezeichenfolge mit < 1.Teil>, < 2.Teil>, .... Das Ergebnis ist ein CSV-Format, das von Ihrer Sprache der Wahl, Excel oder was auch immer interpretiert werden kann

\((.*)\) passt alles in Klammern. Die Klammern sind nicht Teil der Erfassungsgruppe, da die wörtlichen Klammern/(und /) außerhalb der Erfassungsklausel (. *) Liegen. ^ und $ sind hier nicht notwendig, können aber verwendet werden, um Übereinstimmungen nur nahe dem Ende oder nahe dem Anfang zu finden.

+0

Für $ meinst du es passt zum Ende der Zeile? Wie würde ich das in meinem Kontext tun? Weil die Symbole mich irgendwie irgendwie verwirren. – LovesPie

+0

Ein Beispiel in Perl: echo "(hd) (2015) Avatar.ext, Douchebackson.ext" | perl -pe "s/^ \ ((. *) \) * \ ((. *) \) * (. *) *, * (. *) $/\ 1, \ 2, \ 3, \ 4/g " hd, 2015, Avatar.ext, Douchebackson.ext ^ und $ sind hier nicht notwendig, können aber verwendet werden \ (: (. *) \) * \ ((. *) \) * (. *) *, * (. *) $ –

+0

Sorry, ich weiß nicht, warum ich es nicht verstehe. Ich habe ein bisschen herumgetüftelt, um es zum Laufen zu bringen. Aber ich bekomme Syntax-Fehler-Flags, die mich bitten, die Token zu löschen, oder ich bekomme überhaupt keine Ausgabe. – LovesPie

0

Hinweis: Da es sich um eine Schulaufgabe handelt, werde ich nicht erklären, was passiert, also Ihrer Fantasie überlassen. Sie sollten es Ihrem Lehrer erklären können.

Versuchen folgenden Code:

String data = "(HD 1080p) (2015) Batman vs Superman.mov," + 
     "tearsinheavan-ericclapton.mp3," + 
     "(HD 1080p) (2015) Batman vs Superman.mov," + 
     "tearsinheavan-ericclapton.mp3,(HD 1080p) (2015) Batman vs Superman.mov," + 
     "tearsinheavan-ericclapton.mp3,"; 

String rxString = "(?ism)(?<movie>\\(.*?\\) \\(\\d{4}\\).*?\\." + 
     "\\w+(?=[,\n]))|(?<music>[^(,\n]*?\\-[^,]+)"; 

Pattern regex = Pattern.compile(rxString); 

Matcher regexMatcher = regex.matcher(data); 
while (regexMatcher.find()) { 
    String movie = regexMatcher.group("movie"); 
    String music = regexMatcher.group("music"); 

    if(movie!=null) { 
     System.out.printf("Movie:\t%s\n", movie); 
    } 

    if(music!=null) { 
     System.out.printf("Music:\t%s\n", music); 
    } 
} 

Es Ausdruck wird:

Movie: (HD 1080p) (2015) Batman vs Superman.mov 
Music: tearsinheavan-ericclapton.mp3 
Movie: (HD 1080p) (2015) Batman vs Superman.mov 
Music: tearsinheavan-ericclapton.mp3 
Movie: (HD 1080p) (2015) Batman vs Superman.mov 
Music: tearsinheavan-ericclapton.mp3 
+0

Ich erhalte einen Fehler bei '.matcher', weil meine' Daten' von einer ArrayList stammen, die von einer ArrayList konvertiert wurde. Das Media-Objekt besteht aus einem String und einem Bild (JLabel und ImageIcon). Ich werde versuchen, die ArrayList in einen String zu verwandeln und zu sehen, ob es das behebt. – LovesPie

+0

Nun, das ist ein separates Problem. Sie können ArrayList mit String zusammenführen. – Saleem

+0

Oder wiederholen Sie das obige Snippet für jedes Element von ArrayList. Es gibt Vor-und Nachteile, aber als Student sollten Sie Ihre Möglichkeiten zu bewerten. – Saleem

Verwandte Themen