0

我在 document.xml 文件中有一个单词 docx:

-<w:r><w:tab/>
  <w:t><%= @grantor
  </w:t></w:r>
-<w:r w:rsidR="008E7A5B">
  <w:t>1.upcase %>, MANAGER
</w:t></w:r>

我需要从 ERB 标记(<%= 和 %>)之间取出 xml 标记,并将它们放在右 ERB 括号(%>)后面。

移动这个:

  </w:t></w:r>
-<w:r w:rsidR="008E7A5B">
  <w:t>

最后:

-<w:r><w:tab/>
  <w:t><%= @grantor1.upcase %>
  </w:t></w:r>
-<w:r w:rsidR="008E7A5B">
  <w:t>, MANAGER
</w:t></w:r>

我知道使用正则表达式解析 XML 不是一个好主意,但这是微不足道的。可能需要遍历每组 ERB 标签,仅在 ERB 标签之间抓取第一个“<”和最后一个“>”之间的任何内容,而不是文档的其余部分......并将它们移动到该 %> 后面. 这会很好用,因为我永远不会出于任何原因将“<”或“>”放在我的 ERB 标签中。所有这些可能无法在单个正则表达式中完成,但我不确定如何去做。也许正则表达式 /<%=.+%>/ (不知道如何制作这个多行),然后遍历这些实例并在每个实例上运行正则表达式。但后来我不确定如何移动。作为新手,非常感谢任何帮助。

4

1 回答 1

0

我有一个单词 docx

这是你的第一个问题。只处理纯文本文件。

但这是微不足道的

不是真的——一点也不。

我知道使用正则表达式解析 XML 不是一个好主意

无论如何,您的文本都不是有效的 XML,因为它在标记的内容中包含 < 和 > 字符,例如:

<w:t>
  <%= @grantor
</w:t>

因此,不确定 xml 解析器是否可以处理损坏的 xml。

这是一个更强大的解决方案:

str = %q{
<%= "hello" %>

<w:r>
  <w:tab/>
  <w:t><%= @grantor</w:t>
</w:r>
<w:r w:rsidR="008E7A5B">
  <w:t>1.upcase %>, MANAGER</w:t>
</w:r>

<%= "goodbye" %>

<w:r>
  <w:tab/>
  <w:t><%= @grantor</w:t>
</w:r>
<w:r w:rsidR="008E7A5B">
  <w:t>2.downcase %>, MANAGER</w:t>
</w:r>
}


str.gsub!(/<%= (.*?) %>/xms) do |match|
  erb_contents = Regexp.last_match[1]
  xml = ""

  if erb_contents.gsub!(/< .* >/xms, "")
    xml = Regexp.last_match[0]
  end

  "<%=#{erb_contents}%>#{xml}"
end

puts str

--output:--

<%= "hello" %>

<w:r>
  <w:tab/>
  <w:t><%= @grantor1.upcase %></w:t>
</w:r>
<w:r w:rsidR="008E7A5B">
  <w:t>, MANAGER</w:t>
</w:r>

<%= "goodbye" %>

<w:r>
  <w:tab/>
  <w:t><%= @grantor2.downcase %></w:t>
</w:r>
<w:r w:rsidR="008E7A5B">
  <w:t>, MANAGER</w:t>
</w:r>
于 2013-08-15T17:30:53.723 回答