【问题标题】:Regex - Include all other line sections in their own capture groups正则表达式 - 将所有其他行部分包含在自己的捕获组中
【发布时间】:2017-05-31 00:40:13
【问题描述】:

我有一个包含以下内容的日志文件:

Log Started
Created Date: YY/MM/DD Time: HH:MM:SS Start
Added resources at module on YY/MM/DD HH:MM
Module 2 excecute
Resource depleted at HH:MM n pieces
Open YY/MM/DD HH:MM:SS Log to refer
Target end date of new resource YY/MM/DD approved
Log Ended. Result OK

传说:

  • 'YY/MM/DD' & 'HH:MM:SS' - 这些是不重要的时间戳
  • 其他所有内容 - 还有重要数据

注意事项:

  • 如您所见,日期和时间可以两者在同一行, 位于行内任意位置,时间可以是 HH:MM 或 HH:MM:SS。
  • 有些行根本没有个日期/时间戳

我目前有下面的正则表达式,但它只能捕获每一行的日期和时间戳:

(\d{2}(\d{2})?\/\d{2}\/\d{2}(\d{2})?)|(\d{2}:\d{2}(:\d{2})?)

但是,我需要能够捕获整行,并将每个重要和不重要的数据部分放在一个组中。

【问题讨论】:

  • 您使用哪种语言运行此正则表达式?例如PHP、JavaScript 等
  • @David Im 使用 C#
  • 您要捕获没有时间戳的行吗?
  • @David 是的,我还需要能够捕捉到这一点,我会用它来更新我的问题,谢谢。
  • 您需要不重要的时间戳,还是只需要破折号?

标签: regex regex-group


【解决方案1】:

我不确定如何在 C# 中执行此操作(因为我以前从未使用过它),但这里是我将使用的正则表达式:

1。获取整行

(.*)\n

基本上只匹配所有内容,直到找到新行 char \n

2。获取每一行的非时间戳

将日志文件复制到一个新的临时变量中并删除所有时间戳和split the resulting string by the newline chars \nDEMO

3。获取不重要的时间戳

(\d{2}(\d{2})?\/\d{2}\/\d{2}(\d{2})?)|(\d{2}:\d{2}(:\d{2})?)

你的正则表达式非常好,而且效果很好:)

【讨论】:

  • 另外,请尝试使用 regex101 的代码生成器功能,它可能对您的情况有所帮助。
  • 非常感谢您提供非常简洁的建议,但如果破折号是实际字符串,我将如何更改正则表达式?我只是为了说明的目的用破折号替换了重要的数据,所以实际上它们是句子、短语、数字等。
  • @slimjourney 哦,很高兴知道,也许您可​​以使用示例数据和新要求更新您的问题?无论如何,我会看看我是否能找到更好的解决方案。
  • 是的,我很抱歉,相应地更新了上面的示例行。附:我上面替换的示例数据只是一些占位符,因为无法共享日志,但希望它能给您带来想法。
  • @slimjourney 好的,感谢您提供示例数据。我已经更新了我的答案(只是第 2 步),你能再检查一次吗?附:您可能需要更新您所说的问题:'-' 这些是重要数据
【解决方案2】:

首先,您必须使用(.*)\n 对每一行进行分组。然后您必须使用分组字符串中的正则表达式替换日期格式。

检查这里。 https://msdn.microsoft.com/en-us/library/e7f5w83z(v=vs.110).aspx

【讨论】:

  • 您知道如何根据捕获的组的时间长度用一组虚拟字符串替换日期/时间戳吗?例如,如果我捕获 HH:MM:SS Id 将其替换为 8 个“X”,而如果我捕获“HH:MM” Id 仅将其替换为 5 个“X”
  • @slimjourney 这对于纯正则表达式是不可能的,您需要进行两次不同的搜索和替换,第一次将 HH:MM:SS 替换为 8 个“X”,第二次将 HH:MM 替换为 5 “X”。
  • @David 我明白了,我得问一个关于 C# 用 1 个字符替换整个字符串的不同问题,再次感谢您的帮助。
  • OK @slimjourney 没问题 :) 我的回答对你有帮助吗?如果可以,你可以accept it吗?
  • 我的 $s = "HH:MM"; $s =~s/(HH\:MM(\:SS)?)/'x' x 长度($1)/e;打印 $s."\n";
猜你喜欢
  • 2020-02-10
  • 1970-01-01
  • 2023-03-15
  • 2016-03-03
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多