2015-02-22 1 views
5

Mam ciąg znaków - na przykład "Hello Worrld". Zauważ, że litera "r" powtarza się dwa razy.Wyrażenie regularne z wyprzedzeniem - Identyfikacja powtarzających się kolejnych liter

Chciałbym zidentyfikować litery, które występują kolejno (dwa lub więcej razy) i zachować tylko jeden z nich. To znaczy, chciałbym otrzymać "Hello World" z jednym "r".

Golang nie ma wyrażeń regularnych z uprzedzeniem.

Próbowałem za pomocą następującego wyrażenia regularnego w celu identyfikacji listów, które powtarzają się kolejno -

r := regexp.Compile(`(.)\1`) 

Ale wybiera zarówno wystąpień liter - chciałbym tylko jeden z nich, które zostaną wybrane.

+0

Będziesz także chcą 'Hello' stać' Helo' , dobrze? Wyrażenie powinno mieć postać '(.) \ 1 +', aby uchwycić 'wooorrrrrrld'. – dasblinkenlight

+0

O tak. Poprawny. Oczekiwanie polega na zidentyfikowaniu wszystkich liter, które powtarzają się kolejno i zachowują tylko jedną z nich. – callmekatootie

+0

Nie znam biblioteki regex w go, więc nie mam pojęcia, jak to zrobić, ale powinien istnieć sposób na odzyskanie pierwszej grupy przechwytującej, która odpowiada kropce w nawiasach. Całe wyrażenie, które w wielu implementacjach regex odpowiada zeru grupy, będzie pasować do wszystkich identycznych liter, ale pierwsza grupa przechwytująca będzie tylko pierwszą literą. – dasblinkenlight

Odpowiedz

5

Można użyć wiązań pcre, jednak jeśli po prostu chcesz usunąć dup liter można użyć strings.Map, na przykład:

func stripDups(s string) string { 
    var last rune 
    return strings.Map(func(r rune) rune { 
     if r != last { 
      last = r 
      return r 
     } 
     return -1 
    }, s) 
} 

playground

+1

Piękna. Działa zgodnie z oczekiwaniami. Usuwa kolejne zduplikowane litery zachowując tylko jedną z nich. – callmekatootie