2016-04-02 43 views
1

PostgreSQL中正則表達式前瞻/回顧後在posgres

使用regexp_matches有內容,如文本字段:

unique_string_abc 
<ul> 
    <li>a1</li> 
    <li>a2</li> 
    ... 
    <li>an</li> 
</ul> 
blah 
blah 
<ul> 
    <li>b1</li> 
    ... 
    <li>bn</li> 
</ul> 
blah 
blah 
<ul> 
    <li>c1</li> 
    ... 
    <li>cn</li> 
<ul> 
blah 

試圖讓名單〔A1,A2,A3,...,一],但排除b1..bn,c1..cn

到目前爲止,我能夠使用多個子查詢得到它,與第一個返回<ul>...</ul>之間的滿弦,後來用它拆分:

SELECT regexp_matches(html_text, 
'unique_string_abc\s*?<ul>\s*?(<li>.*?<\/li>)\s*?</ul>', 
'g') 

但想到必須使用一個簡單的方法使用一個單一的正則表達式使用前瞻或後視</ul>

任何指針將不勝感激!

回答

0

我把它壓縮成2個步驟。我認爲,由於這個問題,壓縮成單個步驟的正則表達式只能用於某些特殊情況。

Lookbehinds需要是零寬度,從而量詞不允許



  1. 獨立[a1至an]包含李標籤和排除[b1至CN ]。
    (I inffered之間[a1至an]和[b1至CN]區別是消息 「unique_string_abc」 後面從正則表達式<UL>標記。)

    (?< = unique_string_abc \ S <UL>) [\ s \ S] *?(?= </ul >)

  2. 提取[a1到an]。

    (?< = <李>)。*(?= < /李>)

+0

謝謝!這就是我一直在做的事情,希望有一些很酷且簡單的正則表達式將它簡化爲一步 – user3397554