oracle 如何从clob列中的大型文本文件中提取IP地址?

kwvwclae  于 2023-08-03  发布在  Oracle
关注(0)|答案(1)|浏览(173)

我有一个列,其中包含clob中的大型文本文件。它是一个json,但每个文件可以有不同的密钥名称。如何提取文件中任何位置的任何IP地址,而不管密钥名称是什么?
我尝试过类似的变化,但我要么得到一个无休止的空行返回,要么它完成返回什么。

SELECT
  REGEXP_SUBSTR(
    REGEXP_REPLACE(json, '[^0-9.]', ' '),
    '\b(?:\d{1,3}\.){3}\d{1,3}\b',
    1,
    LEVEL
  ) AS extracted_ip
FROM
  kg_json_tst
CONNECT BY PRIOR DBMS_RANDOM.VALUE IS NOT NULL
       AND REGEXP_SUBSTR(REGEXP_REPLACE(json, '[^0-9.]', ' '), '\b(?:\d{1,3}\.){3}\d{1,3}\b', 1, LEVEL) IS NOT NULL

字符串

ojsjcaue

ojsjcaue1#

试试这个:

WITH mytable AS (SELECT 'This is a 192.0.0.1 test of a really powerful 10.5.23.251 address that is perfectly 4.30.1.2 reasonable' sample_text
                   FROM dual) -- testdata
SELECT sample_text,
       seq,
       SUBSTR(section,2,INSTR(section||' ',' ',2)-2) ip_address -- remove anything after it
  FROM (SELECT sample_text,
               seq,
               SUBSTR(marked,INSTR(marked,'$',1,b.seq)) section -- start with the IP address for this sequence
          FROM (SELECT sample_text,
                       REGEXP_REPLACE(sample_text,'([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})','$\1') marked
                  FROM mytable) a,
               (SELECT ROWNUM seq FROM dual CONNECT BY LEVEL < 100) b
         WHERE INSTR(marked,'$',1,b.seq) > 0) -- get as many rows as IP addresses in the string

字符串
如果您可能从同一个CLOB获得超过100个IP,则必须将100提高到更高的数字。从技术上讲,这将匹配500.500.500.500,这不是法律的的IP地址。您可以增强regexp,将前几位限制为0-2,但299.299.299.299也是不法律的的。最终,你不得不创建一个函数来应用各种IP规则,以真正确保你有一个好的IP。但在许多情况下,我认为四个八位字节的字符串几乎可以识别为IP,并且可能足够好。最后,使用我的方法,你需要选择一个不在文本中的标记($)。CHR(19)或类似的东西可能是更好的选择。

相关问题