正则表达式可选组不起作用

时间:2013-01-16 23:02:50

标签: regex html-parsing

目前我正在学习正则表达式,有很多我不理解的东西。

我有一个带有表格的网站,我想要提取这些项目。其中一列可以包含修复值(在此示例中为“foo”)或不包含任何内容,其他列始终包含一些数据。它们的提取效果很好,但特殊列中的可选内容却没有。因此我使用像

这样的表达式
<a id=x .*?>(.*?)</a>.*?<a id=y .*?>(.*?)</a>

我的实际问题是最终表达式的以下部分

...   .*?(foo)?.*?   ...

应该在其他单元格之间实现一个内容为foo的单元格,该单元格可能会丢失并且只应返回其中。我究竟做错了什么?一些基本的理解?

1 个答案:

答案 0 :(得分:0)

在正则表达式.*?(foo)?.*?中,由于foo是可选的,因此正则表达式引擎只会查看文本中的当前位置。如果foo存在,则会包含在匹配中;否则,它会跳过而不检查根本没有foo

您可以通过将正则表达式修改为(.*?foo|.*?).*?来稍微改变行为。正则表达式将尽力找到下一个foo。除非前面的字符串不包含foo,否则上面的正则表达式肯定会消耗foo。在regex-directed engine中,交替|不公平,在这种情况下,正则表达式引擎最好在尝试下一个之前匹配前面指定的引擎,如果匹配任何内容,那么它将继续on(除非前方有一些不匹配的东西然后它会转回并回溯)。

请注意,我上面演示的内容很可能一个解决方案。您应该查看数据以查看是否有任何好的功能来限制字符的消耗方式,以便您可以区分匹配项。