我正在尝试用红宝石标签中的双引号替换所有出现的单引号。例子:
<%= 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的Replace: [input box]
中替换什么。
像$1'$2
之类的东西,但我不知道有多少捕获?
答案 0 :(得分:0)
我不使用sublime,但在vscode中这样的工作:
<%= t\("([^"]*)"\) %>
替换为<%= t('$1') %>
仍然不完美(假设只有一对“,如果有更多你需要再次运行替换):
<%=([^"]*)"([^"]*)"([^"]*)%>
=&gt; <%=$1'$2'$3%>
答案 1 :(得分:0)
你的正则表达式不起作用的原因是显而易见的。它只捕获一个"
并跳过所有其他{但是它应该停在"
所在的每个位置。可以使用 \G
token 。
由于Sublime Text正则表达式是Perl兼容(PCRE),因此regex是解决此问题的正确方法:
正则表达式:
<%(?:(?!%>)[^"])*\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)
Sublime Text preview: