java - 多行java的正则表达式

标签 java regex scala

我需要从类似于下面的 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 个单词字符开头,后跟 ^^。因此,您匹配的最后一个字段应该匹配任何不以该模式开头的行。如果 ^^ 只是一个示例,您可以使用整个 \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 个非单词字符
      • .* - 该行的其余部分

关于java - 多行java的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46679679/

相关文章:

java - 如何用新节点替换dom节点?

regex - 查找不在行首的字符

Scala:基于同一层次结构的另一个类型参数值限制参数

java - 乘以 ID 映射抛出 BaseEntity

java - Netty 4 - 池返回一个尚未准备好发送实际消息的 channel

java - 通过 intent 向 Viber 和 Line 等应用程序共享视频会引发错误

.net - 如何防止 .Net 中的正则表达式挂起(或为其设置超时)

python 2.7 re.MULTILINE 问题

json - 将Scala列表转换为Json对象

scala - 如何在 sbt 中执行 grep