2016-11-07 12 views
1

Ich habe eine Zeichenfolge, die mit ; beginnen und/oder enden kann. Ich möchte diese ; Zeichenfolgen zusammenbringen und ersetzen. Die folgende Regex funktioniert, aber wie kann ich es einfacher machen?Regex startet und/oder endet mit String - wie vereinfacht?

(?:^(;).*)(?:.*(;)$)|(?:^(;).*)|(?:.*(;)$) 

Dies verwendet die Struktur AB | A | B (A und B oder A oder B).

Beispiel Strings:

  • ; foo ;bar; (2 Matches)
  • foo ;bar; (1 Spiel)
  • ; foo ;bar (1 Spiel)
  • foo ;bar (0 Matches)
+1

Die äußeren nicht einfangenden Gruppen wirken sich nur auf readabi aus lität. Was ist die erwartete Leistung, BTW? Versuchen Sie ['^; \ s * |; \ s * $'] (https://regex101.com/r/bxvKtd/1). –

+1

Vier Fälle, warum nicht zuerst alle Starts und dann alle Enden behandeln. Dann haben Sie 2 unabhängige Fälle. –

Antwort

1

Beachten Sie, dass Nicht einfangende Gruppen sind dazu gedacht, Sequenzen von Mustern zu gruppieren, und wenn Sie d o die Gruppe nicht quantifizieren, noch Alternativen im Inneren verwenden, wird die nicht einfangende Gruppe überflüssig. Also, Sie Regex wird wie ^(;).*.*(;)$|^(;).*|.*(;)$ ohne diese Gruppen aussehen und Sie sehen leicht, dass es eine doppelte .* in der ersten Alternative gibt. Wenn Sie das Muster auf ^(;).*(;)$|^(;).*|.*(;)$ reduzieren, sehen Sie, dass wenn der erste Teil nicht übereinstimmt, der zweite oder dritte ; gefolgt von einem Leerzeichen entweder am Anfang oder am Ende findet, so dass die erste Alternative redundant aussieht (es sei denn, Sie müssen die Ersatzlogik aufteilen) für 3 Fälle!).

Also, wenn Sie nur das Spiel mit 1 Ersetzungsmuster ersetzen möchten, können Sie nur

verwenden
^;\s*|;\s*$ 

Siehe die regex demo

+1

Perfekt. Vielen Dank! –