从文本块中提取标记的正则表达式
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%,而且不太可能我猜日志的其他部分会有这样的东西混入。
我从日志文件中检索到以下文本块
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%,而且不太可能我猜日志的其他部分会有这样的东西混入。