【问题标题】:How do i remove   — – special characters from my XML files如何从我的 XML 文件中删除   - - 特殊字符
【发布时间】:2010-07-27 18:41:47
【问题描述】:

这是 xml 文件的示例

<row tnote="0">
<entry namest="col2" nameend="col4" us="none" emph="bld"><blst>
<li><text>Single, head of household, or qualifying widow(er)&#x2014;$55,000</text></li>
<li><text>Married filing jointly&#x2014;$115,000</text></li>
</blst></entry>
<entry colname="col6" ldr="1" valign="middle">&#x2002;</entry>
<entry colname="col7" valign="middle"> 5.</entry>
</row>

&amp;#x2014; 等代表 HTML 4.0 实体。我想将每一行的文本存储为数组的一个元素,但如果该行只是&amp;#x2002;

if e.text.strip =~ /^&#x20[0-9][0-9];$/ then
next
else
subLines << e.text
end

但它似乎不起作用...我的正则表达式不正确吗?

【问题讨论】:

  • 这段代码是什么语言的? strip 是做什么的?
  • 不,字符引用不代表实体。反过来说:实体用于表示字符引用。 &amp;mdash; 是一个实体引用,名为 mdash 的实体表示值 &amp;#8212;(参见 w3.org/TR/html4/sgml/entities.html#h-24.2.1)。所以实体引用 &amp;mdash; 引用了字符引用 &amp;#8212;,它引用了 Unicode 字符 U+2014。
  • @Gumbo:U+nnnn 表示法使用十六进制数字,而不是十进制:U+2014
  • @Alan Moore:是的,当然可以。

标签: ruby xml regex parsing


【解决方案1】:

&amp;#x...; 不是实体引用,而是字符引用。对于 XML 解析器,&amp;#x2014; 与原始字符 完全相同,因此当您通过诸如 element.text 之类的属性查看由 XML 解析器生成的 DOM 时,您将看不到任何带有 & 符号的内容,而是一个简单的 字符。

因此,原则上,您可以将其与诸如/[—– ]/ 之类的正则表达式相匹配。但是,如果您使用的是 Ruby 1.8,您会遇到语言本身不支持 Unicode 的问题,因此/[—– ]/ 中的字符组将无法正常工作:它会尝试删除每个字节在 的 UTF-8 表示中,这可能会破坏任何其他字符。

每个目标字符的简单字符串替换将正常工作,因为这不需要特殊字符处理。 (当然,如果您在源代码中直接包含像 这样的字符,您还必须正确获取该脚本的文件编码,因此可能更容易使用像 "\xe2\x80\x94" 这样的字符串文字转义。)

【讨论】:

    【解决方案2】:

    因为你的正则表达式是/^...$/ 的形式,它只会匹配整个字符串。您只会跳过完全由一个 HTML 实体组成的文本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-04
      • 2016-10-17
      相关资源
      最近更新 更多