/ / SublimeText regexp заменя цитати в руби тагове - regex, sublimetext3

SublimeText regexp заменя цитати в руби тагове - regex, sublimetext3

Опитвам се да заместя всички появявания на двойни кавички, на единични котировки, в маркери на рубин.Примери:

  • <%= 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%>