目前我正在学习正则表达式,有很多我不理解的东西。
我有一个带有表格的网站,我想要提取这些项目。其中一列可以包含修复值(在此示例中为“foo”)或不包含任何内容,其他列始终包含一些数据。它们的提取效果很好,但特殊列中的可选内容却没有。因此我使用像
这样的表达式<a id=x .*?>(.*?)</a>.*?<a id=y .*?>(.*?)</a>
我的实际问题是最终表达式的以下部分
... .*?(foo)?.*? ...
应该在其他单元格之间实现一个内容为foo的单元格,该单元格可能会丢失并且只应返回其中。我究竟做错了什么?一些基本的理解?
答案 0 :(得分:0)
在正则表达式.*?(foo)?.*?
中,由于foo
是可选的,因此正则表达式引擎只会查看文本中的当前位置。如果foo
存在,则会包含在匹配中;否则,它会跳过而不检查根本没有foo
。
您可以通过将正则表达式修改为(.*?foo|.*?).*?
来稍微改变行为。正则表达式将尽力找到下一个foo
。除非前面的字符串不包含foo
,否则上面的正则表达式肯定会消耗foo
。在regex-directed engine中,交替|
不公平,在这种情况下,正则表达式引擎最好在尝试下一个之前匹配前面指定的引擎,如果匹配任何内容,那么它将继续on(除非前方有一些不匹配的东西然后它会转回并回溯)。
请注意,我上面演示的内容很可能不一个解决方案。您应该查看数据以查看是否有任何好的功能来限制字符的消耗方式,以便您可以区分匹配项。