Java 正则表达式环视查询 - 我很挣扎

问题描述 投票:0回答:1

因此,我被要求编写一个脚本,该脚本将大型 IIS 日志作为输入并处理它以进行一些日志记录。 IIS 日志包含大量(对我来说)无用的信息,其中一些 blob 包含用户访问某些内容的时间。这些格式为域\身份。

我有捕获组:

(DOMAIN\\[a-z]\d+)

这匹配域名和身份(其格式以单个字母开头,后跟一些数字(不是固定长度)。示例:test 123456 或 test 213。

我希望有人比我更擅长 Java REGEX 可以帮助弄清楚如何捕获除该捕获组之外的所有内容。 我想运行一个查询来删除所有其他内容。

因为我有那个捕获组,所以我总是可以将匹配写入一个新文件并实现相同的输出...但是我使用的工具(Apache Nifi)有可以轻松替换内容的工具,但我必须做一个更复杂一点(例如,使用实际的脚本)根据匹配来生成新的输出。

我知道可能有无数其他方法可以更简单地做我想做的事情...但是因为我徒劳地浪费了 20 分钟在 regex101 上玩,我希望有人能启发我。 日志中的示例行如下所示:

testingtesting123 test\t12345 512.1235.212.321 Apples+Test/9.9.9+(Product:+129+10.492.29) - 400 testing testing123
regex regex-lookarounds
1个回答
0
投票

使用您的捕获组捕获所有日志条目怎么样? 和结尾的新行。然后将其替换为捕获 组和新线路。

然后添加一个替代项来匹配完整的日志条目,只是将其删除 无需在替换中替换它。

注释的正则表达式,Java 风格,带有

m
x
标志:

^ # Begin of log entry (assuming it's a begin of line).
(?: # Two variants:
  # A) A line to keep where we extract the domain\user
  # Anything, ungreedy, to avoid "eating" the domain\user.
  .*?
  # Begin of word, domain\user, end of word.
  \b(?<domainUser>DOMAIN\\[a-z]\d+)\b
  # Anything and the captured new line, to use in the replacement.
  .*(?<newLine>\R|\z)
|
  # B) A log entry without the interesting domain\user.
  .*\R
)

替换为

${domainUser}${newLine}

实际操作:https://regex101.com/r/nkUSR3/1

© www.soinside.com 2019 - 2024. All rights reserved.