RegEx backreferences w IntelliJ

130

Chcę użyć funkcji Znajdź i zamień IntelliJ, aby wykonać następującą transformację:

// Replace this
model.put('foo', 'bar')
// With this
model['foo'] = bar

Wypróbowałem następujące:

Tekst do znalezienia: model.put\((.*),(.*)\) zamień na:model\[\\1\] = \\2

Ale Intellij nie wydaje się rozpoznawać \\1i \\2jako odwołania wsteczne. Próbowałem też pojedynczego ukośnika, ale to też nie działa.

Dónal
źródło

Odpowiedzi:

197

IntelliJ używa $1do zastępowania odwołań wstecznych.

Z pomocy IntelliJ:

Aby uzyskać więcej informacji na temat wyrażeń regularnych i ich składni, zapoznaj się z dokumentacją dotyczącą java.util.regex. Odwołania wsteczne powinny mieć format $ n, a nie \ n.

Steve K.
źródło
16
Wygląda na to, że „\” nie jest wymagane: jetbrains.com/idea/help/… . Ponadto dla mnie działa to tylko wtedy, gdy wyraźnie otoczę moją grupę za pomocą „()”, w przeciwnym razie nie mogę później odwołać się do niej. Np. (foo)Zastąp wyszukiwanie :$1bar
Ghedeon
@Ghedeon: Prawdopodobnie powinieneś dodać swój komentarz jako odpowiedź lub do istniejącej odpowiedzi. Twoja sugestia umieszczenia wyrażenia w () zadziałała w moim przypadku.
mindreader
+1 bit informacji, które rozwiązać mój problem związany: Jestem zastępując cudzysłowu-plus obwoluty wokół zmiennych z owijarki kręcone w dolarach, czyli '+ var +'do ${var}niektórych ciągów szablonów i nie mógł zrozumieć, dlaczego IntelliJ nie zakończyć wymianę. okazuje się, $że trzeba uciec w wymianie.
worc
13

Krótko mówiąc, trzeba użyć $1, aby $nza zamiennych wstecznych. \1składnia służy tylko do odwołań wstecznych w ramach wyszukiwania.

W IntelliJ 2016 dokumentacja w aplikacji jest myląca. Oto lepszy cytat z pełnej dokumentacji:

Jeśli chcesz odnieść się do dopasowanego podciągu gdzieś poza bieżącym wyrażeniem regularnym (na przykład w innym wyrażeniu regularnym jako ciąg zastępujący), możesz go pobrać, używając znaku dolara ($ num, gdzie num = 1..n).

Źródło: składnia wyrażeń regularnych 2016.1, porady i wskazówki

Barett
źródło
2

Pomoc kontekstowa w produkcie dla wyrażenia regularnego w Idea 9.0 (i być może w innych wersjach) wydaje się być niepoprawna. Stwierdza to:

  Referencje wsteczne
  \ n
  Niezależnie od dopasowania n-tej grupy przechwytującej

Ale najwyraźniej, jak wspomniałem w poprzednich odpowiedziach i z mojego doświadczenia, tak naprawdę jest to \ $ n dla odniesień wstecznych, a nie \ n

Dostęp do pomocy kontekstowej można uzyskać, klikając łącze „[Pomoc]” obok opcji radiowej „Wyrażenie regularne” w oknie dialogowym „Zastąp tekst”

Dolina górska
źródło
0

IntelliJ IDEA / Odniesienie / Odniesienie do składni wyrażeń regularnych


Dopasowuje podwyrażenie i zapamiętuje dopasowanie. Jeśli potrzebujesz użyć dopasowanego podciągu w tym samym wyrażeniu regularnym, możesz go pobrać, używając odwołania wstecznego (\ num, gdzie num = 1..n). Jeśli chcesz odwołać się do dopasowanego podciągu gdzieś poza bieżącym wyrażeniem regularnym (na przykład w innym wyrażeniu regularnym w polu Zamiennik), możesz go pobrać, używając znaku dolara ($ num, gdzie num = 1..n). Jeśli musisz dołączyć znaki nawiasów do wyrażenia podrzędnego, użyj „(” lub „)”.

Cong De Peng
źródło
Znalazłem to samo tutaj ; jednak ostatecznie odniosłem sukces używając 1 $, bez odwrotnego ukośnika.
Joe Tricarico