Wyszukiwanie wyrażeń regularnych zastąp w Sublime Text 2

440

Chcę, aby wyszukiwanie zastąpiło wyrażenia regularne w Sublime Text 2. Dokumentacja na ten temat jest raczej anemiczna. W szczególności chcę zastąpić grupy, więc coś w stylu konwersji tego tekstu:

Hello my name is bob

I to wyszukiwane hasło:

Znajdź co: my name is (\w)+

Zamienić: my name used to be $(1)

Wyszukiwane hasło działa dobrze, ale nie mogę znaleźć sposobu, aby faktycznie zastąpić go za pomocą grupy wyrażeń regularnych.

hackerhasid
źródło

Odpowiedzi:

584

Zwykle referencją wsteczną jest albo ( $1lub \1odwrotny ukośnik) dla pierwszej grupy przechwytywania (pierwsze dopasowanie wzorca w nawiasach), i rzeczywiście Sublime obsługuje obie składnie. Więc spróbuj:

my name used to be \1

lub

my name used to be $1

Pamiętaj również, że twój oryginalny wzór przechwytywania:

my name is (\w)+

jest niepoprawny i przechwytuje tylko ostatnią literę nazwy, a nie całą nazwę. Aby przechwycić wszystkie litery nazwy, należy użyć następującego wzoru:

my name is (\w+)
Bobulous
źródło
15
z wyjątkiem, czyż nie $0?
Skylar Saveland
11
Nie, 0 $ nie jest używane jako odwołanie wsteczne w wyrażeniu regularnym (ponieważ \0jest równe null znak i \0dddjest używane jako ucieczka dla znaku o punkcie kodowym ddd). Jednak $0wydaje się być używany w Sublime2 jako „znak wyjścia” zgodnie z tą stroną (chociaż mam problem ze znalezieniem wystarczającej liczby przykładów, aby dokładnie ustalić, w jaki sposób znak wyjścia jest używany w Sublime2).
Bobulous
3
Znak wyjścia $0jest używany w Sublime Text 2/3, aby umieścić kursor na wyjściu z rozszerzenia fragmentu. Więcej informacji o fragmentach .
jrhorn424
2
0 USD nadal działa w przypadku
odsyłania wstecznego
2
$0jest całym dopasowaniem wyrażenia regularnego; $1jest pierwszą grupą przechwytującą.
Oletha
103

Nawiasem mówiąc, w powyższym pytaniu:

Dla:

Hello, my name is bob

Znajdź część:

my name is (\w)+

Z częścią zamienną:

my name used to be \1

Wróciłbym:

Hello, my name used to be b

Zmień znajdź część na:

my name is (\w+)

I zamień będzie to, czego oczekujesz:

Hello, my name used to be bob

Chociaż (\ w) + będzie pasować do „bob”, nie jest to grupa, którą chcesz zastąpić.

CrnaStena
źródło
52

Ważne: użyj ( )nawiasów w ciągu wyszukiwania

Chociaż poprzednia odpowiedź jest poprawna, należy podkreślić ważną rzecz! Wszystkie dopasowane segmentów w ciągu wyszukiwania , które chcesz użyć w ciągu zastępowania muszą być otoczone ( )nawiasami , inaczej te dopasowane odcinki nie będą dostępne dla określonych zmiennych, takich jak $1, $2lub \1, \2etc.

Na przykład chcemy zamienić „em” na „px”, ale zachować wartości cyfr:

    margin: 10em;  /* Expected: margin: 10px */
    margin: 2em;   /* Expected: margin: 2px */
  • Łańcuch zastępczy: margin: $1pxlubmargin: \1px
  • Wyszukaj ciąg (PRAWIDŁOWO): margin: ([0-9]*)em// z nawiasami
  • Wyszukaj ciąg (NIEPRAWIDŁOWY): margin: [0-9]*em

PRZYKŁAD PRAWIDŁOWEGO PRZYKŁADU: Używanie margin: ([0-9]*)emciągu wyszukiwania (w nawiasach). Załącz żądany dopasowany segment (np. $1Lub \1) w ( )nawiasach w następujący sposób:

  • Znajdź: margin: ([0-9]*)em(z nawiasami)
  • Zamień na: margin: $1pxlubmargin: \1px
  • Wynik:
    margin: 10px;
    margin: 2px;

PRZYKŁAD NIEPRAWIDŁOWEGO PRZYKŁADU: Używanie margin: [0-9]*emciągu wyszukiwania (bez nawiasów). Poniższy wzór wyrażenia regularnego będzie pasował do żądanych linii, ale dopasowane segmenty nie będą dostępne w zastąpionym ciągu jako zmienne takie jak $1lub \1:

  • Znajdź: margin: [0-9]*em(bez nawiasów)
  • Zamień na: margin: $1pxlubmargin: \1px
  • Wynik:
    margin: px; /* `$1` is undefined */
    margin: px; /* `$1` is undefined */
Hrvoje Golcic
źródło
1
Dziękuję, ta odpowiedź naprawdę wskazuje na interesujący fakt, który rozwiązał mój problem.
Enkk
Dzięki za zwrócenie na to uwagi. Za pomocą () mogę wykonać zamianę na \ 1 w Sublime 3.
Jeffrey
47

Oto wizualna prezentacja zatwierdzonej odpowiedzi.

wprowadź opis zdjęcia tutaj

zeeawan
źródło
dlaczego nie znajduje $_SESSION[(\w+)? dzięki
Toni Michel Caubet
Ponieważ $, [, (i) są znakami specjalnymi, dlatego powinieneś uciec przed każdym znakiem specjalnym odwrotnym ukośnikiem.
zeeawan
25

Pamiętaj, że jeśli używasz więcej niż 9 grup przechwytywania, musisz użyć składni ${10}.

$10lub \10lub nie\{10} będzie działać.

Andreas Haferburg
źródło
Dzięki! Pomogło mi to zastąpić i dodać liczbę na końcu przechwyconej grupy, np. Aby dołączyć 1drugą grupę przechwytywania, musisz użyć nawiasów klamrowych takich jak ${2}1; 21 USD odnosi się do 21. grupy przechwytywania, która nie istnieje.
Eric
1

Patrząc na artykuł z nieoficjalną dokumentacją Sublime Text na temat Search and Replace , wygląda na to, że +(.+)jest to grupa przechwytywania, której możesz chcieć ... ale ja osobiście korzystałem (.*)i działała dobrze. Aby WYMIENIĆ w sposób, w jaki mówisz, możesz polubić tę rozmowę na forach , szczególnie ten post, który mówi, aby po prostu użyć $1pierwszej przechwyconej grupy.

A ponieważ zdjęcia są lepsze niż słowa ...

Przed: przed znajdź / zamień

Po: po znajdź / zamień

Blairg23
źródło