我正在尝试匹配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
但正如您在我的示例输出中所看到的那样,这似乎不像我希望的那样工作,并且当我期望计数为2时,它总是返回0,
有谁知道我做错了什么,或者可能采取不同的方式试图解决这个问题?谢谢!
答案 0 :(得分:1)
现在好吧,我不觉得自己觉得愚蠢....我在发布此消息后几分钟就找到了解决方案。
我没有尝试匹配行尾$
和行^
的开头,而是通过将其连接在一起直接匹配新行:
REGEXP_COUNT(MULTI_LINE_TXT, '^EVENT TYPE ID: 1' || CHR(10) || 'Port3$', 1, 'm') AS PORT_3_ID_1_CNT
当我这样做时,它返回我希望的2的计数。