Regex 正则表达式可选组不工作

Regex 正则表达式可选组不工作,regex,html-parsing,Regex,Html Parsing,目前我正在学习正则表达式,还有很多事情我不明白 我有一个带有表格的网站,我想在那里提取项目。其中一列可以包含固定值(在本例中为“foo”),也可以不包含任何内容,其他列始终包含一些数据。对它们的提取效果很好,但特殊列中的可选内容不起作用。所以我用了一个表达式 <a id=x .*?>(.*?)</a>.*?<a id=y .*?>(.*?)</a> 这应该实现在其他单元格之间有一个包含内容foo的单元格,该单元格可能会丢失,并且只有在其存在时才应

目前我正在学习正则表达式,还有很多事情我不明白

我有一个带有表格的网站,我想在那里提取项目。其中一列可以包含固定值(在本例中为“foo”),也可以不包含任何内容,其他列始终包含一些数据。对它们的提取效果很好,但特殊列中的可选内容不起作用。所以我用了一个表达式

<a id=x .*?>(.*?)</a>.*?<a id=y .*?>(.*?)</a>
这应该实现在其他单元格之间有一个包含内容foo的单元格,该单元格可能会丢失,并且只有在其存在时才应返回。我做错了什么?一些基本的理解?

在regex
*?(foo)?*
中,由于
foo
是可选的,regex引擎将只查看文本中的当前位置。如果有
foo
,它将被包括在比赛中;否则,它将跳过,而不检查是否存在任何
foo

通过将正则表达式修改为
(.*?foo |.*).*?
,可以稍微改变行为。正则表达式将尽力找到下一个
foo
。除非前面的字符串不包含
foo
,否则上面的正则表达式肯定会使用
foo
。在中,交替
|
是不公平的,在这种情况下,正则表达式引擎在尝试下一个之前将尽最大努力匹配前面指定的一个,如果它匹配任何内容,则它将继续(除非前面有不匹配的内容,否则它将返回并回溯)


请注意,我上面演示的内容很可能不是解决方案。您应该查看数据,看看是否有什么好的功能可以限制字符的使用方式,以便区分匹配项。

学习很好,但regex不是从html中提取数据的正确工具。从网站提取数据的好方法是什么?Regex似乎非常灵活和有趣:)好的,谢谢,我会看看这个,但我的问题对我来说也很有趣,因为我不理解这种情况下的行为。一些有趣的比较:vs
...   .*?(foo)?.*?   ...