从文本块中提取标记的正则表达式

regular expression to extract tokens from block of text

我从日志文件中检索到以下文本块

SELECT statement with ID: AE12400 SELECT /*+ ALL_ROWS */
T1.CONFLICT_ID, T1.LAST_UPD, T1.CREATED,
T1.LAST_UPD_BY, T1.CREATED_BY, T1.MODIFICATION_NUM,
T1.ROW_ID, T1.DFLT_LIC_FLG, T1.NAME, T1.VAL,
:1 FROM SIEBEL.S_LST_OF_VAL T1 WHERE
(T1.ACTIVE_FLG = :2 OR T1.ACTIVE_FLG IS NULL) AND (T1.TYPE = :3 AND T1.BU_ID IS NULL) ORDER BY T1.TYPE, T1.ORDER_BY, T1.VAL Bind variable 1: ,,,SADMIN,00000002579c129c:0,,List Of Values (Internal), Bind variable 2: Y Bind variable 3: ZERO_DTIME_MODE
***** SQL Statement Execute Time: 0.028 seconds ***** 3 row(s) retrieved by ID: AE0EF18

我需要从这个区块中获取以下令牌

Statement Id : AE12400 

SQL_Query: SELECT /*+ ALL_ROWS */ 
        T1.CONFLICT_ID, T1.LAST_UPD, T1.CREATED, 
        T1.LAST_UPD_BY, T1.CREATED_BY, T1.MODIFICATION_NUM, 
        T1.ROW_ID, T1.DFLT_LIC_FLG, T1.NAME, T1.VAL, 
        :1 FROM SIEBEL.S_LST_OF_VAL T1 WHERE 
        (T1.ACTIVE_FLG = :2 OR T1.ACTIVE_FLG IS NULL) AND (T1.TYPE = :3 AND T1.BU_ID IS NULL) ORDER BY T1.TYPE, T1.ORDER_BY, T1.VAL

Bind Variable : [",,,SADMIN,00000002579c129c:0,,List Of Values (Internal)","Y","ZERO_DTIME_MODE"]

SQL Time: 0.028

SQL Rows: 3

到目前为止,我已经提出了以下正则表达式来提取语句、时间和行

SQL Rows : \s\d{1,4}\s
SQL Time: \d{1,3}\.\d{1,4}
Statement Id: (ID:)(\s\w+)

但我不确定如何从文本中提取 SQL 和绑定变量。

您当前的模式不准确,因为它们可能匹配其他非预期的子字符串。因此,我将提供所有需要的表达式:

SQL 行:

\d{1,4}(?=\s*row)

查询运行时间:

(\d+(?:\.\d+)?)(?=\s*second)

声明 ID:

ID:\s*(\w+)

SQL 语句(m:点匹配换行符):

(?m)ID:\s\w+\s(.*?)(?=Bind variable)

绑定变量:

(?m)Bind variable\s*\d+:\s*(.*?)(?=Bind variable|$)

对于绑定变量,您应该使用编程语言中的 matchAll()findAll() 类似方法。 [Live demo,查看匹配组块]

这些可以清理;他们不是很有效,因为他们是。但这应该会让您朝着正确的方向前进。

SQL_Query: SELECT(?! statement with ID)[\W\w]*?(?=Bind variable \d)

如果您要对包含多个文本块的整个日志进行正则表达式处理,则必须先获取所有绑定变量,然后再从中获取每个绑定变量。否则,您可以跳过该步骤。

查找绑定变量:Bind variable \d+:[\W\w]*?(?=\s+\*\*\*\*\*)

提取变量:Bind variable \d+:\s*([\W\w]*?)(?=Bind variable)

也可能会出现问题,例如,在您的 SQL 查询中有文本 "Bind variable"...但是很难做到 100%,而且不太可能我猜日志的其他部分会有这样的东西混入。