Oracle 11g正则表达式多个模式实例

时间:2012-12-18 02:17:11

标签: regex oracle

我需要从'<中提取信息a href =“...”> something.jpg< / A>”递归的大字符串中的标记,可以包含多个标记实例。我需要在Oracle 11g上使用正则表达式来执行此操作。

我正在寻找的一个例子是:

示例字符串:

该字符串将始终包含至少1个<的实例。一个>标签并没有最大值可以包含多少 href总是一个xid - [[:digit:]]
标签中的属性可能会有所不同

<p>text about something important</p><p><a href="@X@EmbeddedFile.requestUrlStub@X@bbcswebdav/xid-1234_1" target="_blank">file.pdf</a> </p><p><a href="@X@EmbeddedFile.requestUrlStub@X@bbcswebdav/xid-1235_1" target="_blank">anotherfile.pptx</a> </p><p><a href="@X@EmbeddedFile.requestUrlStub@X@bbcswebdav/xid-1236_1" target="_blank">yetanotherfile.pdf</a> </p>

现在有了这个字符串,我想提取3&lt; a ...&gt; ...&lt; / A&GT;块使用
REGEXP_SUBSTR(&lt; string&gt;,'&lt; pattern&gt;',&lt; start&gt;,&lt; occurrence&gt;)并调整出现值以获取3个实例。

到目前为止我所拥有的是:

SELECT REGEXP_SUBSTR(main_data, ''<a[[:print:]]+href="[[:print:]]+xid-1234_1"[[:print:]]+>[[:print:]]+</a>'', 1, 1)
      FROM table

我得到的结果是

<a href="@X@EmbeddedFile.requestUrlStub@X@bbcswebdav/xid-1234_1" target="_blank">file.pdf</a> </p><p><a href="@X@EmbeddedFile.requestUrlStub@X@bbcswebdav/xid-1235_1" target="_blank">anotherfile.pptx</a> </p><p><a href="@X@EmbeddedFile.requestUrlStub@X@bbcswebdav/xid-1236_1" target="_blank">yetanotherfile.pdf</a>

所以它从第一个&lt; a然后一直抓到最后一个&lt; / a取代。当我需要它在&lt;的第一个实例停止时/ a取代。然后当我将事件增加到2时,它应该抓住第二组&lt;一个&GT;&LT; / A&GT;标签。但是,当前将事件设置为2则不返回。

任何帮助将不胜感激。谢谢

3 个答案:

答案 0 :(得分:1)

您是否考虑过使用Oracle的各种XML工具?

例如,将文本放入CLOB,然后使用xmltype()和extract()使用XPath查询(see for example this question)来获取元素。

通常,尝试使用正则表达式提取嵌套数据结构会导致不快乐。

答案 1 :(得分:0)

正如@Jacques Chester所说,如果你能使用XML支持,那就不那么痛苦了。

如果您不能,请尝试将+更改为+?以执行非贪婪的匹配。

+?限定符是Perl-influenced Extensions in Oracle Regular Expressions

的一部分

答案 2 :(得分:0)

是的,非贪婪的运算符?是解决方案:

SELECT REGEXP_SUBSTR(x,'<a href="(.*?)".*?>(.*?)</a>',1, 3, 'i', 0)
  FROM (SELECT '<p>text about something important</p><p><a href="@X@EmbeddedFile.requestUrlStub@X@bbcswebdav/xid-1234_1" target="_blank">file.pdf</a> </p><p><a href="@X@EmbeddedFile.requestUrlStub@X@bbcswebdav/xid-1235_1" target="_blank">anotherfile.pptx</a> </p><p><a href="@X@EmbeddedFile.requestUrlStub@X@bbcswebdav/xid-1236_1" target="_blank">yetanotherfile.pdf</a> </p>' as x FROM DUAL);

返回

<a href="@X@EmbeddedFile.requestUrlStub@X@bbcswebdav/xid-1236_1" target="_blank">yetanotherfile.pdf</a>

或其他标记,如果您将3更改为1或2.

如果您将最后0替换为1,则会获得href的内容:

@X@EmbeddedFile.requestUrlStub@X@bbcswebdav/xid-1236_1

如果您将其替换为2,则会获得

yetanotherfile.pdf