我需要从类似于下面的 SQL 日志中解析和提取值。
SQL^^0001^^ABCDEF^^26^^XYZ
SQL^^0002^^ABCDEF^^26^^XYZ
abc
<>()_asc wHERE
SQL^^0003^^ABCDEF^^12^^XYZ
SQL^^0004^^ABCDEF^^28^^XYZ
但是日志并不总是单行。我有一个正则表达式可以捕获如果它是单行。除最后一个元素外,这些字段的长度也是固定的。最后一个元素的长度可以变化。
(\w{3})\W{2}(\d{4})\W{2}(\w{6})\W{2}(\d{2})\W{2}(.*)
^^ is the delimiter but can be any other value also.
没有固定的行尾字符,但在这种情况下我需要捕获直到下一行 SQL。 如果是多行日志,如何解析日志并提取它们。我正在尝试用Java。 Java 或 scala 是首选。
最佳答案
您可以利用以下事实:每条记录均以 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 个非单词字符.*
- 该行的其余部分
关于java - 多行java的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46679679/