Ruby Regex捕获两个字符串之间的所有内容(包括)
我正在尝试清理一些HTML并删除一个标签(我真的想避免使用nokogiri等)。 所以我有以下字符串出现我想要摆脱:
Some junk here that's different every time
这在我的字符串中只显示一次,我想找到一种方法将其删除。 我已经尝试用正则表达式来捕获它,但我找不到一个有效的。
我已经尝试/
(.*)/m这样
/
(.*)/m ,但它也会匹配并包含文档中的任何其他
标记,我不想要。
关于如何处理这个的任何想法?
我相信你正在寻找一个非贪婪的正则表达式,像这样:
/(.*?)<\/div>/m
注意添加?
。 现在,捕获组将捕获尽可能少(非贪婪),而不是尽可能多(贪婪)。
因为它增加了另一个依赖性并减慢了我的工作量。 使事情变得更复杂。 此外,此解决方案不仅适用于HTML标记。 我的开始和结束字符串可以是任何东西。
我曾经以相同的方式思考,直到我找到写蜘蛛和网站分析的工作,然后编写一个大的RSS聚合系统 – 解析器是摆脱这种疯狂的唯一途径。 没有它,工作永远不会完成。
是的,正则表达式是好的和有用的,但有龙等着你。 例如,这个常见字符串会导致问题:
'foo'
正则表达式/
(.*?)<\/div>/m
将返回:
"foo"
这种格式错误但可渲染的HTML:
foo
更糟糕的是:
'foo'[/(.*?)<\/div>/m] => nil
然而,解析器可以处理两者:
require 'nokogiri' [ 'foo', 'foo' ].each do |html| doc = Nokogiri.HTML(html) puts doc.at('div.the_class').text end
输出:
foo foo
是的,你的开始和结束字符串可以是任何东西,但有很多公认的工具可用于解析HTML / XML,随着你的任务增长,使用正则表达式的弱点将变得更加明显。
而且,是的,解析器可能会失败。 我不得不处理解析器爆炸严重错误的RSS源,但是一些预处理解决了这个问题。
Interesting Posts