我需要从'<中提取信息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则不返回。
任何帮助将不胜感激。谢谢
答案 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