Опитвам се да заместя всички появявания на двойни кавички, на единични котировки, в маркери на рубин.Примери:
<%= t(".headline") %>
<%= f.text_field :email, class: "center big" %>
Опитах (?<=<%=s)(.*)(")(.*)(?=s%>)
който съвпада t(".headline")
в групи като:
1. [4-16] `t(".headline`
2. [16-17] `"`
3. [17-18] `)`
Очевидно няма да улови всички събития и да обедини всичко останало.
Също така, аз не съм какво да заместя в Sublime "s Replace: [input box]
, Нещо като $1"$2
и т.н., но няма да знам колко са улавяните там?
Отговори:
0 за отговор № 1Причината, поради която вашият регекс не работи, е очевидна "
и пропуска всички останали, но трябва да спре на всяка позиция, където a "
се намира. Това може да се направи с G
жетон.
Тъй като Редукционните изрази на Високият текст са съвместими с Perl (PCRE) под регекс е правилното решение на този проблем:
Регулярни изрази:
<%(?:(?!%>)[^"])*K"|(?!A)G(?:(?!%>)[^"\])*(?:\.(?:(?!%>)[^"\])*)*K"
Заместване низ: "
Обяснение:
<% # 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)
Външен визуализация на текст:
0 за отговор № 2
Не използвам възвишеното, но във vscode нещо подобно работи:
<%= t("([^"]*)") %>
замени с <%= t("$1") %>
Все още не е перфектен (предполага, че има само един чифт ", ако има повече, ще трябва да стартирате отново):
<%=([^"]*)"([^"]*)"([^"]*)%>
=> <%=$1"$2"$3%>