【问题标题】:Perl end-of-line regexPerl 行尾正则表达式
【发布时间】:2013-05-20 15:58:52
【问题描述】:

我有一个 Perl 脚本,它执行正则表达式来查找标记标签 (<tag>)。

我的正则表达式是:<tag([^>]+)>

这适用于大多数情况,但是,我发现了一个不起作用的实例。

如果<tag> 具有以下格式....

<tag 
attr="12345">

正则表达式工作正常。

但是,如果&lt;tag&gt; 看起来像这样。

<tag attr="12345"
>

没有匹配。我已经测试过我的正则表达式是 Notepad++,它适用于所有实例。问题出在我的 Perl 脚本中。

我已经尝试了几个终端锚点,但到目前为止都没有运气。非常感谢任何帮助!

已编辑 这是我的代码行。

$line =~s/<tag([^>]+)>/<!--tag $1-->/g;

【问题讨论】:

  • 不确定正则表达式是否是问题所在。我试过了:$ perl -e 'if (&lt;&gt; . &lt;&gt; =~ /&lt;tag([^&gt;]+)&gt;/) { print "yes\n" }' &lt;tag attr="12345" &gt; yes 并且有效。也许你需要展示更多的代码(也许是一个小的 repro 程序)。
  • 为我工作:my $s = qq(&lt;tag attr="12345"\n&gt;); $s =~ /&lt;tag([^&gt;]+)&gt;/ and print $1; 提供attr="12345"。
  • 不要使用正则表达式解析 HTML。您无法使用正则表达式可靠地解析 HTML,并且您将面临悲伤和挫败感。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关如何使用已经编写、测试和调试的 PHP 模块正确解析 HTML 的示例,请参阅 htmlparsing.com/php。
  • 我的错误:这是 Perl 版本:htmlparsing.com/perl
  • 如果它看起来像 XML 或 HTML,请尝试使用已建立的模块之一。有一些 HTML 解析器可用于从文本中解析出标签,即使它们不是 HTML 标签但看起来很像。

标签: regex perl html-parsing


【解决方案1】:

你调用字符串来操作$line。这很可疑,因为您之前必须连接多行,才能检查多行标签。 请检查(或发布)您的连接代码。我 90% 确定问题就在那里。

您还有另一个问题,您不一定知道。 如果同一行有多个标签,您的正则表达式也会替换第一个和最后一个之间的文本。

<tag foo="1">foo bar <tag bar="2">baz spam

会变成

<!--tag foo="1">foo bar <tag bar="2"-->baz spam

在您接受治疗后,尽管您可能想要

<!-- tag foo="1"-->foo bar <!--tag bar="2"-->baz spam

请使用 + 量词的惰性版本:+?。

$line = ~s/<tag([^>]+?)>/<!--tag $1-->/g;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    相关资源
    最近更新 更多