在 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 的计数。
我正在尝试匹配 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 的计数。