从C#移植到Delphi,Regex不兼容

时间:2014-02-15 10:59:59

标签: regex delphi http delphi-xe5

我是HTTP和Regex的新手。我有一段代码,我已经移植到Delphi部分工作。在特定声明中引发了“ lookbehind not of fixed length ”的异常:

'(?<=image\\?c=)[^\"]+'

声明用于从html表单中提取图像链接。在这里和网上进行了一些研究之后,我逐渐明白最终的' + '会导致Regex的某些实现。我找不到的是如何将其更改为在Delphi的实现中工作。由于代码在C#中有效,有人可以帮忙解释一下吗?

1 个答案:

答案 0 :(得分:4)

lookbehind部分没有固定的长度。这与最后的+无关。 lookbehind部分是(?<=image\\?c=)。你从C#复制了它。在C#中,正则表达式想要查找文字问号。这是正则表达式中的一个特殊字符,所以它需要在它前面加一个反斜杠。反斜杠在C#字符串中是特殊的,因此反斜杠需要另一个反斜杠,所有这些只是代表一个问号。

在Delphi字符串中,反斜杠并不特殊,因此将它们中的两个视为要在正则表达式中搜索的文字反斜杠。问号没有被转义,因此Delphi正则表达式将其视为使文字反斜杠可选的指令。可选字符使lookbehind具有可变长度。

要解决此问题,只需删除一个反斜杠。

您也可以删除引号前的那个,但它应该没有效果,因为引号在正则表达式中并不特殊。

即使您使用HTML解析器来识别包含此URL片段的HTML元素,您仍可能需要正确的正则表达式来识别您的目标HTML元素。