在 PL\SQL 中使用多行模式正则表达式跨多行匹配

Matching Across Multiple Lines Using Multiline Mode Regex In PL\SQL

我正在尝试匹配 CLOB 中包含的多行字段中的两行。这是我正在尝试做的一个例子:

SELECT MULTI_LINE_TXT,
       REGEXP_COUNT(MULTI_LINE_TXT, '^EVENT TYPE ID: 1$', 1, 'm') AS ID_1_CNT, --Works as expected
       REGEXP_COUNT(MULTI_LINE_TXT, '^EVENT TYPE ID: 1$^Port3$', 1, 'm') AS PORT_3_ID_1_CNT --Does not work how I am hoping
  FROM (SELECT 'EVENT TYPE ID: 1' || CHR(10) || 'Port3' || CHR(10) || 'EVENT TYPE ID: 2' || CHR(10) || 'Port3' || CHR(10) ||
               'EVENT TYPE ID: 1' || CHR(10) || 'Port3' || CHR(10) || 'EVENT TYPE ID: 2' || CHR(10) || 'Port3' || CHR(10) ||
               'EVENT TYPE ID: 1' || CHR(10) || 'Port4' || CHR(10) || 'EVENT TYPE ID: 2' || CHR(10) || 'Port4' AS MULTI_LINE_TXT
          FROM DUAL)

示例输出:

ROW |   MULTI_LINE_TXT      |   ID_1_CNT    |   PORT_3_ID_1_CNT
---------------------------------------------------------------
1   |   EVENT TYPE ID: 1    |   3           |   0
    |   Port3               |               |
    |   EVENT TYPE ID: 2    |               |
    |   Port3               |               |
    |   EVENT TYPE ID: 1    |               |
    |   Port3               |               |
    |   EVENT TYPE ID: 2    |               |
    |   Port3               |               |
    |   EVENT TYPE ID: 1    |               |
    |   Port4               |               |
    |   EVENT TYPE ID: 2    |               |
    |   Port4               |               |

我的第一个正则表达式:

REGEXP_COUNT(MULTI_LINE_TXT, '^EVENT TYPE ID: 1$', 1, 'm') AS ID_1_CNT

按预期计算 EVENT TYPE ID: 1 的所有事件。我遇到的问题是我不知道这个事件对应于哪个端口,除非我也引用以下行。

我试图引用下一行做这样的事情:

REGEXP_COUNT(MULTI_LINE_TXT, '^EVENT TYPE ID: 1$^Port3$', 1, 'm') AS PORT_3_ID_1_CNT

但是正如您在我的示例输出中看到的那样,这似乎并不像我希望的那样工作,它总是 returns 计数为 0,而我期望计数为 2。

有谁知道我做错了什么,或者我可以尝试解决这个问题的不同方法吗?谢谢!

好吧,我不觉得自己很傻吗....我在发布这个后几分钟就想出了一个解决方案。

我没有尝试匹配行 $ 的结尾和行 ^ 的开头,而是直接通过将其连接到以下位置来匹配新行:

REGEXP_COUNT(MULTI_LINE_TXT, '^EVENT TYPE ID: 1' || CHR(10) || 'Port3$', 1, 'm') AS PORT_3_ID_1_CNT

当我这样做时 returns 我希望达到 2 的计数。