2016-07-12 4 views
2

Ich habe eine Zeichenfolge der folgenden Form "Some_text_AAAABB_some_other_text". Es gibt eine willkürliche gerade Anzahl von "A" in der Saite und "BB" ist eine feste Saite, die auf die "A" folgt. Angenommen, es gibt 2n 'A's Ich möchte eine Regex verwenden, um die' A 'mit einer Zeichenfolge von' A's der Länge n zu ersetzen.Ist es möglich, die Hälfte einer Zeichenfolge mit Regex oder die Hälfte einer passenden Gruppe zu finden?

Für die folgende Zeichenfolge

"some_text_AAAABB_some_other_text" 

das Ergebnis

"some_text_AABB_some_other_text" 

Ist es überhaupt möglich wäre, dies mit regex zu erreichen?

Ich benutze V8 Javascript, um die Transformation durchzuführen.

+2

Was ist die Werkzeug/Programmier-Sprache, die Sie verwenden, Marcinie? Was ist die erwartete Ausgabe für '" some_text_AAAAABB_some_other_text "'? –

+0

Um eine * gerade * Anzahl von 'A's zu erreichen, könnten Sie [' (?: A {2}) + '] (https://regex101.com/r/oY8eF9/1) verwenden. Wie @ WiktorStribiżew jedoch darauf hingewiesen hat, was mit * ungeraden * Vorkommnissen geschehen soll? – Jan

+2

Ordne es mit '(A +) \ 1' zu und ersetze die Übereinstimmung durch' \ 1'. – SilentMonk

Antwort

2

Es gibt zwei Szenarien: 1) Anzahl der A s ist gerade, 2) Anzahl der A s ist ungerade.

Wenn Sie nicht egal, ob es eine gerade oder ungerade Anzahl von A s ist, benutzen Sie einfach

replace(/(A+)\1BB/g, "$1BB") 

wo (A+) Spiele und fängt in Gruppe 1 ein oder mehrere A s so viele wie möglich und \1 entspricht der gleichen Teilzeichenfolge (die gleiche Nummer wie in Gruppe 1). Da BB eine feste Zeichenfolge ist, fügen wir sie einfach als Literal in das Muster ein.

Siehe this regex demo

Wenn Sie nicht über eine Zeichenfolge mit einer ungeraden Anzahl von A s ändern wollen, müssen Sie

replace(/(^|[^A-Z])(A+)\2BB/g, "$1$2BB") 

Siehe this regex demo

Hier ist die erste Capture-Gruppe fängt den Start der Zeichenkette ^ oder eines anderen Zeichens als , die zweite Erfassungsgruppe erfasst 1 oder mehr A s und die Rückreferenz hat jetzt die ID = 2 - daher wird \2 verwendet.

+0

Dennoch könnte die ungerade Anzahl von 'A'-Szenario für zukünftige Leser nützlich sein, also fügte ich dieses Bit hinzu. –