[英]Regular expression for multiline java
我需要从类似于以下内容的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个字符char开头,后跟^^
。 因此,您匹配的最后一个字段应匹配所有不以该模式开头的行。 如果仅以^^
为例,则可以只使用整个\\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{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个非单词字符 .*
-该行的其余部分
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.