/ / SublimeText regexp zamienia cudzysłowy wewnątrz ruby ​​- regex, sublimetext3

SublimeText regexp zastępuje cudzysłowy wewnątrz ruby ​​tagów - regex, sublimetext3

Próbuję zamienić wszystkie wystąpienia podwójnych cudzysłowów na pojedyncze cudzysłowy w ruby. Przykłady:

  • <%= t(".headline") %>
  • <%= f.text_field :email, class: "center big" %>

Próbowałem (?<=<%=s)(.*)(")(.*)(?=s%>) który pasuje t(".headline") w grupach takich jak:

1.  [4-16]  `t(".headline`
2.  [16-17] `"`
3.  [17-18] `)`

Oczywiście nie przechwytuje wszystkich wystąpień i grupuje wszystko inne.

Poza tym nie jestem czym zastąpić w Sublime Replace: [input box]. Coś jak $1"$2 itd., ale nie wiem, ile jest zdjęć?

Odpowiedzi:

0 dla odpowiedzi № 1

Powód, dla którego wyrażenie regularne nie działa, jest oczywisty. Przechwytuje tylko jeden " i pomija wszystkie pozostałe, ale powinien zatrzymać się na każdej pozycji, gdzie a " jest usytuowany. Można to zrobić za pomocą G znak.

Ponieważ wyrażenia regularne Sublime Text są kompatybilne z Perl (PCRE) poniżej regex jest właściwym rozwiązaniem tego problemu:

Regex:

<%(?:(?!%>)[^"])*K"|(?!A)G(?:(?!%>)[^"\])*(?:\.(?:(?!%>)[^"\])*)*K"

Ciąg zastępujący: "

Wersja demonstracyjna na żywo

Wyjaśnienie:

<%                      # Match beginning of Ruby tag
(?:(?!%>)[^"])*         # Match any thing except a double quote - caring not to jump over closing tag (zero or more times)
K"                     # Up to a double quote (K reset all match so far)
|                       # OR
(?!A)G                # Assert end of previous match
(?:(?!%>)[^"\])*       # Match any thing except a double quote and backslash - caring not to jump over closing tag (zero or more times)
(?:                     # Start of non-capturing group (c)
\.                     # Match an escaped character
(?:(?!%>)[^"\])*       # Match any thing except a double quote and backslash - caring not to jump over closing tag (zero or more times)
)*                      # End of non-capturing group (c) (zero or more times)
K"                     # Up to a double quote (K reset all match so far)

Podgląd wysublimowanego tekstu:

wprowadź opis obrazu tutaj


0 dla odpowiedzi nr 2

Nie używam wzniosłego, ale w vscode działa coś takiego:

<%= t("([^"]*)") %> zamienić <%= t("$1") %>

Nadal nie jest idealny (zakłada się, że jest tylko jedna para „, jeśli jest więcej, będziesz musiał ponownie uruchomić zamień):

<%=([^"]*)"([^"]*)"([^"]*)%> => <%=$1"$2"$3%>