1

目前我正在学习正则表达式,有很多东西我不明白。

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

<a id=x .*?>(.*?)</a>.*?<a id=y .*?>(.*?)</a>

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

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

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

4

1 回答 1

0

在 regex.*?(foo)?.*?中,因为foo是可选的,所以 regex 引擎只会查看文本中的当前位置。如果foo存在,它将被包含在匹配中;否则,它会跳过而不检查是否有任何内容foo

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

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

于 2013-01-17T01:22:54.853 回答