2016-05-07 3 views
1

Ich möchte entfernen alles zwischen [] und()nur einen bestimmten Teil halten, die zwischen Klammern und entfernen Sie alle andere, die

Proben ist:
ST Aktion Ausgabe 08 (1988-1912) (GollnerPublishing Ltd)
ST Magazine 070 (1993-1903) (La Terre du Milieu) (fr)
20000 Meilen unter dem Meer (1988) (Coktel Vision) [cr Big 4]
Ein Tag bei den Rennen (1989) (Team) (Platte 1 von 2) [cr MCA]

Mein Regex: [^a-zA-Z\s\d][\d-()A-Za-z\] ]+

Es funktioniert, der einzige Haken ist, dass ich diesen behalten muss: (Diskette 1 von 2). Im letzten Beispiel wäre das etwa so: Ein Tag an den Rennen (Diskette 1 von 2)

Ich kann keinen Weg finden, (Disk 1 of 2) auszuschließen (dh 'nicht übereinstimmen') und es zu integrieren im ganzen Ausdruck.

Antwort

1

Sie können eine negative Vorschau nutzen (?![([]Disk 1 of 2[\])]) die (Disk 1 of 2) oder [Disk 1 of 2] Anpassung vermeiden:

(?![([]Disk 1 of 2[\])])(?:\([^()]*\)|\[[^\][]*]) 

die regex demo

Der (?:\([^()]*\)|\[[^\][]*]) Teil nur Spiele anschauen entweder eine Zeichenfolge zwischen runden Klammern (Klammern), die keine Klammern innen (\([^()]*\)) oder (|) eine Zeichenfolge in eckigen Klammern, die keine eckigen Klammern enthalten (\[[^\][]*]).

Wenn 1 und 2 sind dynamisch und für ganze Zahlen stehen, verwenden \d+: (?![([]Disk \d+ of \d+[\])])

+0

Es funktioniert natürlich toll, aber ein bisschen zu viel zu kompliziert für mich. Gibt es nicht einen einfacheren Weg dazu (vielleicht würde das meiner ursprünglichen Regex mehr ähneln)? Ich verstehe nur den 'Match wenn Suffix fehlt' Teil, aber dann kann ich es nicht bekommen, um es auch funktionieren zu lassen. – ene

+0

Vielleicht könnten Sie mir einfach die Sprache mitteilen, in der Sie es verwenden? –

Verwandte Themen