首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多行java的正则表达式

多行java的正则表达式
EN

Stack Overflow用户
提问于 2017-10-11 04:09:33
回答 1查看 84关注 0票数 1

我需要解析并从类似于下面的sql日志中提取值。

代码语言:javascript
复制
SQL^^0001^^ABCDEF^^26^^XYZ
SQL^^0002^^ABCDEF^^26^^XYZ
abc
<>()_asc wHERE
SQL^^0003^^ABCDEF^^12^^XYZ
SQL^^0004^^ABCDEF^^28^^XYZ

但是日志并不总是单行的。我有一个正则表达式,如果它是单行的话,它可以捕获。此外,除了最后一个元素外,这些字段都是固定长度的。最后一个元素的长度可以不同。

代码语言:javascript
复制
(\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是首选。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-13 07:11:32

您可以利用这样的事实:每条记录的开头都是三个单词字符,后面跟着^^。因此,您所匹配的最后一个字段应该匹配任何不以该模式开头的行。如果^^只是一个例子,您可以使用整个\w{3}\W{2}\d{4}\W{2}\w{6}\W{2}\d{2}\W{2}模式作为分隔符,而不是^^

使用

代码语言:javascript
复制
(?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个非字字符。
      • .* -行的其余部分

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46679679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档