我需要解析并从类似于下面的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或scala是首选。
发布于 2017-10-13 07:11:32
您可以利用这样的事实:每条记录的开头都是三个单词字符,后面跟着^^。因此,您所匹配的最后一个字段应该匹配任何不以该模式开头的行。如果^^只是一个例子,您可以使用整个\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演示。如果^^只是一个占位符,正如上面提到的那样,用(?!\w{3}\W{2}\d{4}\W{2}\w{6}\W{2}\d{2}\W{2})替换(?!\w{3}\^\^)。或者,也许更短一点的也可以:(?!\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个非字字符。.* -行的其余部分
https://stackoverflow.com/questions/46679679
复制相似问题