【问题标题】:Why is this perl substitution not working? [closed]为什么这个 perl 替换不起作用? [关闭]
【发布时间】:2012-01-18 06:02:44
【问题描述】:
$test2 = "<id><![CDATA[cyber_monday_deal]]></id>\n";

$test2 =~ s/<id><![CDATA[cyber_monday_deal]]><\/id>/<id><![CDATA[cyber monday deal 3]]><\/id>/m;

print $test2

我得到的是旧的 test2,而不是替代的。

任何引号都可以转义要替换的整个字符串吗?

【问题讨论】:

  • 你认为s/&lt;/id&gt;/&lt;/id&gt;/m; 在做什么?你用自己替换了一些东西,你忘了转义/s,而且原始字符串与正则表达式不匹配。
  • @Dan,不,两边不一样
  • 他们是,当我第一次写它时..我的坏..

标签: perl xml-parsing


【解决方案1】:

[CDATA[cyber_monday_deal]] 是一个字符类。

【讨论】:

  • close: [CDATA[cyber_monday_deal] 是一个字符类
【解决方案2】:

您可以使用 \Q 表示正则表达式的一部分,其中元字符(如 [ )应被视为文字字符:

$test2 =~ s/\Q<id><![CDATA[cyber_monday_deal]]><\/id>/<id><![CDATA[cyber monday deal 3]]><\/id>/m;

\Q 的效果在 \E 或正则表达式的结尾处结束。它不会使 $@ 成为文字,而是使任何正则表达式用它们进行插值。

【讨论】:

    【解决方案3】:

    从您最近的问题来看,您尝试使用 Regex 处理 XML 失败了。您显然甚至不明白方括号必须在正则表达式中转义。因此规范不应该是

    /<![CDATA[cyber_monday_deal]]>.../
    

    但是

    /<!\[CDATA\[...\]\]>.../
    

    请使用适当的 XML 解析模块http://perl-xml.sourceforge.net/faq/

    【讨论】:

      猜你喜欢
      • 2014-05-24
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      • 2022-01-26
      相关资源
      最近更新 更多