我需要从类似于下面的SQL日志中解析和提取值。
constructor(props) {
super(props);
this.state = {
recipes: {
"1": {
id: 1,
url: 'http://via.placeholder.com/300x300',
title: '1st Title',
description: 'some decription 1'
},
"2": {
id: 2,
url: 'http://via.placeholder.com/300x300',
title: '1st Title',
description: 'some decription 1'
},
"3": {
id: 3,
url: 'http://via.placeholder.com/300x300',
title: '1st Title',
description: 'some decription 1'
}
}
}
}
但是日志不是单行。我有一个可以捕获的正则表达式如果它是单行。除最后一个元素外,字段的长度也是固定的。最后一个元素的长度可能不同。
SQL^^0001^^ABCDEF^^26^^XYZ
SQL^^0002^^ABCDEF^^26^^XYZ
abc
<>()_asc wHERE
SQL^^0003^^ABCDEF^^12^^XYZ
SQL^^0004^^ABCDEF^^28^^XYZ
没有固定的行尾字符,但在这种情况下我需要捕获到下一行SQL。 如何解析日志并在其多行日志中提取它们。我正在尝试使用Java。 Java或scala是首选。
答案 0 :(得分:0)
您可以利用以下事实:每条记录都以3个字符开头,后跟^^
。因此,您匹配的最后一个字段应匹配任何不以该模式开头的行。如果^^
只是一个示例,您可以使用整个\w{3}\W{2}\d{4}\W{2}\w{6}\W{2}\d{2}\W{2}
模式作为分隔符,而不是^^
。
使用
(?m)^(\w{3})\W{2}(\d{4})\W{2}(\w{6})\W{2}(\d{2})\W{2}(.*(?:\r?\n(?!\w{3}\^\^).*)*)
请参阅regex demo。如果^^
只是一个占位符,如上所述,请将(?!\w{3}\^\^)
替换为(?!\w{3}\W{2}\d{4}\W{2}\w{6}\W{2}\d{2}\W{2})
。或者,或许,较短的一个也会这样做:(?!\w{3}\W{2}\d{4}\b)
。
<强>详情
(?m)^
- 一行开头((?m)
是一个Pattern.MULTILINE
嵌入式标记选项,使^
匹配行首而不是字符串起始位置)(\w{3})
- 第1组:三个字的字符\W{2}
- 2个非单词字符(\d{4})
- 第2组:四位数\W{2}
- 2个非单词字符(\w{6})
- 第3组:六个字的字符\W{2}
- 2个非单词字符(\d{2})
- 第4组:2位数\W{2}
- 2个非单词字符(.*(?:\r?\n(?!\w{3}\^\^).*)*)
- 第5组:
.*
- 除了换行符之外的任何0 +字符,尽可能多(?:\r?\n(?!\w{3}\^\^).*)*
- 零次或多次连续出现:
\r?\n(?!\w{3}\W{2})
- CRLF或LF换行符后跟3个字然后是2个非单词字符.*
- 其余部分