繁体   English   中英

多行Java的正则表达式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM