Delphi XE2正则表达式:Quantifier在正面观察中不起作用?

时间:2014-08-10 00:33:10

标签: regex delphi delphi-xe2

我有一个包含此BASE标记的网页的完整HTML文档字符串:

<BASE href="http://whatreallyhappened.com/">

在Delphi XE2中,我使用这个正则表达式作为主题来获取双引号之间的BASE标记的URL:

BaseURL := TRegEx.Match(HTMLDocStr, '(?<=<base(\s)href=").*(?=")', [roIgnoreCase]).Value;

这是有效的,但前提是BASEhref之间的主题中只有一个空格字符。

我尝试在正则表达式(\s)中的空格部分添加量词,但它不起作用。

那么,即使BASEhref之间有多个空格,我怎样才能使此正则表达式与URL匹配?

2 个答案:

答案 0 :(得分:2)

通过使用环视,你使这太复杂了。如果您只想提取部分正则表达式匹配,只需添加一个捕获组。然后,您可以使用捕获组匹配的文本而不是整体匹配。在大多数情况下,你也会以这种方式获得更好的表现。

要在文件中查找基本标记并提取其URL,您可以使用正则表达式<base[^>]+href=["']([^"']*)["']。致电TRegex.Match()以获得TMatch。这有一个Groups属性,如果找到匹配项,您可以使用它来检索组1。

答案 1 :(得分:0)

有了环顾

您可以使用不同的方式尝试使用这样的量词:

(?<=<BASE)\s+href=".*(?=")
(?<=<BASE)\s{0,30}href=".*(?=")

<强> Working demo

enter image description here

没有环视

顺便说一句,如果您只想获取href中的内容,则无需外观,您可以使用:

<BASE\s+href="(.*?)"

<强> Working demo

enter image description here

编辑:看完你的评论后,我想出了一个解决方法(丑陋但可行)。您可以尝试使用以下内容:

((?<=<BASE\shref=")|(?<=<BASE\s\shref=")|(?<=<BASE\s\s\shref=")).*(?=")
          ^---notice \s        ^---notice \s\s       ^---notice \s\s\s

我知道这很糟糕,但如果上述工作都没有,你可以试试。