SublimeText正则表达式替换ruby标记内的引号

时间:2016-09-10 09:15:01

标签: 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的Replace: [input box]中替换什么。 像$1'$2之类的东西,但我不知道有多少捕获?

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"

替换字符串:'

Live demo

说明:

<%                      # 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:

enter image description here