【问题标题】:regex lookahead/lookbehind in posgrespostgres中的正则表达式前瞻/后视
【发布时间】:2016-04-02 01:26:27
【问题描述】:

在 PostgreSQL 中使用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, ... , an] 的列表,但排除 b1..bn, c1..cn

到目前为止,我能够使用多个子查询来获得它,第一个子查询返回 &lt;ul&gt;...&lt;/ul&gt; 之间的完整字符串,然后使用以下方法将其拆分:

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

但是认为必须有一种更简单的方法来使用单个正则表达式,使用前瞻或后瞻 &lt;/ul&gt;

任何指针将不胜感激!

【问题讨论】:

    标签: regex postgresql pattern-matching regex-lookarounds


    【解决方案1】:

    我把它压缩成两个步骤。由于这个问题,我认为压缩成单步的正则表达式只能在某些特殊情况下使用。

    Lookbehinds 必须是零宽度,因此不允许使用量词



    1. 将包含 li 标签的 [a1 to an] 分开,并排除 [b1 to cn]。
      (我推断 [a1 to an] 和 [b1 to cn] 之间的区别是您的正则表达式中

        标记后面的消息“unique_string_abc”。)

        (?)[\s\S]*?(?=

      )
    2. 提取 [a1 到 an]。

      (?).*(?=

    3. )

    【讨论】:

    • 谢谢!这就是我一直在做的事情,希望有一些很酷且简单的正则表达式可以将其简化为一步
    猜你喜欢
    • 2017-10-08
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    相关资源
    最近更新 更多