2012-01-18 9 views
9

Chcę dopasować wzór, zastąpić część wzoru i użyć zmiennej we wzorze jako części zastępczego ciągu znaków.Regex: Jak zastąpić część wzorca i odwoływać się do zmiennej w nim?

Czy to prawda?

/s/^((\s+)private\sfunction\s__construct\(\))/(2)def\s__init__

W języku angielskim: Wymień dowolną ilość spacji po którym następuje ciąg "private function __construct()" z taką samą ilością białych znaków i ciąg . Czy moje regex jest złe, czy co?

partial replace

+1

W jakim języku/aplikacji używasz tego? (Nie w języku, w którym znajdują się twoje dane. Ten, który wykonuje wyrażenie.) – FakeRainBrigand

+0

@FakeRainBrigand 'Vi'. –

Odpowiedz

6

To się nazywa wsteczne i użyć \i odnieść się do i'th przechwyconego grupy od wzoru.

W przypadku wzoru ^((\s+)private\sfunction\s__construct\(\)) zamiennikiem jest \2def __init__.

+0

Okay, ale oto inny przykład: ': s/^ ((\ s +) $ this ->). * $/\ 2self. /'. Jak widać, szukam '^ (\ s +) this ->. * $', Prawda? Ale chcę tylko zastąpić tę część wzorca wyszukiwania: '\ s + this->'. Tak więc użyłem dwóch zestawów nawiasów .... Czy powinienem odwoływać się do '\ 2' lub' \ 1'? –

+0

Uchwyty przechwytywania są liczone od lewej do prawej, więc "\ 1" dla tego przykładu. Ponieważ jest to vi, musisz uciec od bitu wyrażenia regularnego, zobacz odpowiedź @ PrashantBhate. Albo użyję flagi '\ v' w vim, aby użyć normalnej składni regex, ale nie jestem pewien, czy ma ją vi. –

12

Przypuszczam chcesz zastąpić go vi

zastąpić wszystkie wystąpienia

:s/^\(\s\+\)private function __construct()/\1def __init__/g 

Wymień pierwsze

:s/^\(\s\+\)private function __construct()/\1def __init__/ 

kilka sugestii do wzorca

  • / jest stosowany w vi poszukiwaniu użyć :
  • trzeba uciec () w vi
  • użytku \i gdzie I jest XTH grupa przechwytywania jak \1\2 kopii wzorcowych pogrupowane wzory w wymianie
  • \s nie może być stosowany w tekście zastępującym używać ' ' zamiast
  • wykorzystanie spływu /g jeśli chcesz zastąpić wszystkie wystąpienia

http://vimregex.com powinien pomóc w rozpoczęciu pracy.

+0

Ale tu jest problem .... Jeśli mam '{$ \ n \ r replaceeme', chcę wyszukać' {$ \ n \ r \ s + replaceeme^', a ja chcę tylko zastąpić' \ s + zamień ". Powodem, dla którego chcę to zrobić, jest fakt, że czasami "zamiennik" nie jest poprzedzony '{$ \ n \ r", a nie chcę, aby polecenie się na nim aktywowało. Czy mogę zastąpić "replaceeme" tylko wtedy, gdy jest poprzedzone '{$ \ n \ r' i zacząć zastępowanie z taką samą ilością białych znaków? –

2

Nie sądzę, aby ktokolwiek naprawdę zrozumiał pytanie. Zasadniczo sposób, w jaki to robię jest następujący:

"Jeśli chcesz wyszukać zamienny wzór, narysować wzór a zastąpić go ciągiem zastępczym, wzór i, tylko jeśli zaczyna się od wzoru, wzorzec b, to musisz uwzględnić wzór b w łańcuchu zamiennym, taki jak ten::/(wzór b) (wzór a)/(wzór b) (i)/g ".

Jest trochę rozwlekły, ale warty przeczytania.

W przeszłości, jestem pewien, że ktoś pomyślał: "To może zaoszczędzić wiele zasobów, aby nie zastąpić pattern b z pattern b. Jest to zbyteczne, aby to zrobić." Może dzieje się to automatycznie. Nie znalazłem wbudowanej metody vi ani żadnego innego programu do tego. Jestem pewien, że mógłbym napisać skrypt, żeby to zrobić.

Powiązane problemy