【问题标题】:Perl Regex Pattern MatchingPerl 正则表达式模式匹配
【发布时间】:2011-08-04 18:08:45
【问题描述】:

我想使用名为source.htmlsource.txt 的源文件中的正则表达式:

<OPTION value=5>&nbsp;&nbsp;5 - Course Alpha (3)</OPTION> <OPTION value=6>&nbsp;&nbsp;6 - Course Beta (3)</OPTION>

得到:

5 - Course Alpha (3)
6 - Course Beta (3)

我的意思是我必须找到一个模式:

<OPTION v

 finding first number after it 

所以得到一切,直到我看到:

</OPTION>

如何使用 Perl 使用 Regex 来实现它?

PS:它应该从文件中读取内容并将输出写入文件。

【问题讨论】:

标签: html regex perl pattern-matching


【解决方案1】:

您不想使用正则表达式,而是想使用 HTML 解析器。这是一个good article on the subject,它解释了为什么正则表达式很脆弱以及如何使用HTML::TreeBuilder

还有 a small pile of similar questions and answers 关于从 HTML 文档中提取数据。

【讨论】:

  • 感谢您的回答和想法。我正在阅读它们。还有一件事,我可以使用任何其他库,但是我想为此实现正则表达式。
  • Schwern,虽然我支持您的立场,即在 通用、开放式 HTML 上使用正则表达式是多么具有挑战性,但我们对原始发帖人的情况知之甚少知道该立场是否完全合理并适用于他的案件。据我所知,discrete and well-accounted-for HTML sn-ps 上的正则表达式是完全合理的,有时甚至是首选。如果他们可以控制或以其他方式将问题空间的限制描述为足够小的子集,那么正则表达式比解析方法容易得多,但如果他们不能,那就不是。同意吗?
  • @tchrist 是的。我仍然不相信他有枪。
【解决方案2】:
perl -lwe '$_="<OPTION value=5>&nbsp;&nbsp;5 - Course Alpha (3)</OPTION> <OPTION value=6>&nbsp;&nbsp;6 - Course Beta (3)</OPTION>"; s/\&nbsp;//g; print $1 while /<OPTION [^>]*>([^<]+)/g'

【讨论】:

  • 您应该通过在每行之前放置四个空格来格式化代码。您也可以选择它并单击{} 按钮。 Markdown Editing Help 页面上的更多有用提示。
  • 我试过 perl -0777ne s/\ //g; "print $1 while /
【解决方案3】:

怎么样

/<OPTION v.*?>.*?(\d.+?)<\/OPTION>/

http://regexr.com?2thm8

你会在第一个捕获组中找到你的字符串。

【讨论】:

  • 如果能找到反对票的理由就好了。否则我不可能改进我的答案,而且我也只是一个人。好的,我发现了一个错误并会更改它。
  • @stema 感谢您的回答。我如何查看您在此处编写的网站?
  • 你对错误的问题给出了正确的答案。 OP 不知道使用正则表达式解析 HTML 是一个坏主意,直接回答是没有帮助的。
  • @Schwern,我知道。但是对于简单的情况,获取一些值正则表达式可以是一种选择。我不想争论是否是这种情况。我不解析 html,所以我无法建议他使用这些工具。但是为您的答案+1。始终使用正确的工具!
  • @kamaci 这个页面的使用非常简单。在顶部输入您的正则表达式,在大文本字段中输入您的测试字符串。比赛用蓝色标记,如果您将鼠标移到比赛上,它会为您提供捕获组的内容。右边有关于不同正则表达式的帮助。请注意正则表达式因语言而异,我不知道那一面背后的正则表达式引擎是什么,无论如何我都将它用于 Perl,对于大多数表达式来说没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多