【问题标题】:Regex to find that there is no string正则表达式发现没有字符串
【发布时间】:2016-09-28 14:34:15
【问题描述】:
<block id="123">
    <othertag1>...</othertag1>
    <othertag2>...</othertag2>
    <picture>...</picture>
    <othertag3>...</othertag3>
    <othertag4>...</othertag3>
</block>

如何使用aggrep 在许多文件中找到具有没有 &lt;picture&gt; 标签的此类块?

高级:从&lt;block&gt; 标记中获取"id"。 (例如将它们作为列表输出到标准输出)。

【问题讨论】:

  • 不要使用正则表达式解析 HTML。在您选择的编程语言中使用专用的解析工具。正则表达式没有“块”之类的概念。

标签: regex grep html-parsing ag


【解决方案1】:

是的,你可以用你的锤子敲入那个螺丝。
不过我会推荐一把螺丝刀。
我的意思是我会使用解决它的工具:XPath!

/block[not(picture)]

对于延伸目标:

/block[not(picture)]/@id

如果你要解析 XML,你应该使用 XPath。

【讨论】:

  • 嗯,我以前不想这样做。也许像这样? stackoverflow.com/questions/15461737/…
  • 谢谢,我没有时间等待,所以我用 C++ 编写了最简单的多线程类 sax 解析器 :) 解析 250 GB 总共 21000 个文件需要 10 分钟。
【解决方案2】:

如果必须,您可以使用珍珠正则表达式,其中点匹配包含换行符。例如,使用 ag:

ag '(?s)<block(?!.*?picture).*?</block>'

这将返回跨越多行的块标签之间的内容,同时排除包含这两个块标签之间的图片标签的块。

(?s) 表示 .匹配项包括换行符。 这 ?!是一个负面的展望,在这种情况下,对于“图片”这个词 这 *?在第一张图片和第一个块之前是非贪婪搜索。

注意:我确信这种搜索模式在某些极端情况下不起作用,但我的快速测试运行良好。

如果您希望进一步将结果限制为仅 ID,请通过管道将另一个 ag 传递给您的结果:

ag '(?s)<block(?!.*?picture).*?</block>' <directory with files> | ag -o 'id="([0-9]+)"' 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 2013-08-01
    • 2018-07-07
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    相关资源
    最近更新 更多