多行java的正则表达式

时间:2017-10-11 04:09:33

标签: java regex scala

我需要从类似于下面的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是首选。

1 个答案:

答案 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个非单词字符
      • .* - 其余部分