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 № 1Powó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: "
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:
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%>