【问题标题】:Extracting Number from Log File从日志文件中提取数字
【发布时间】:2016-02-19 09:31:38
【问题描述】:

我正在尝试从输出如下文本行的日志文件中提取一个数字:

1/11/2016 3:26:12 AM 1/11/2016 3:27:00 AM 45.6 A

线路的输出为 45.6 A

但是,我的正则表达式代码从凌晨 3:26:12 返回 12 A。我需要它完全忽略时间数字,只输出 45.6 A。

这是我的正则表达式代码:

$regex = '\d+(?:\.\d+)?(?=\s+A)'

【问题讨论】:

  • 你没有用'$'关闭正则表达式

标签: regex parsing powershell


【解决方案1】:

您只是忘记在字符串末尾锚定前瞻:

\d+(?:\.\d+)?(?=\s+A$)
                    ^

regex demo

\d+(?:\.\d+)? 将匹配一个或多个数字,可选地后跟 .,后跟一个或多个数字(浮点值),(?=\s+A$) 前瞻将需要一个或多个空格字符,A 右在字符串的末尾出现在浮点值之后。

$s = '1/11/2016 3:26:12 AM 1/11/2016 3:27:00 AM 45.6 A'
$rx = '\d+(?:\.\d+)?(?=\s+A$)'
$result = [regex]::Match($s, $rx, 'RightToLeft')
if ($result) { $result.Value; }

【讨论】:

  • 请注意,当前输入字符串并不表明输入中可能有12 A 12 A,并且falsetru 和我的答案都应该有效。但是,如果该值始终位于字符串的末尾,您应该考虑使用我的解决方案并将RightToLeft 修饰符与正则表达式匹配方法一起使用(如果可能)。
【解决方案2】:

您可以使用word boundary (\b) 仅匹配A,而不是AM

\d+(?:\.\d+)?(?=\s+A\b)

演示:https://regex101.com/r/pA7jK2/1

【讨论】:

    【解决方案3】:

    如果你只需要找到最后一个带有 A 的数字,试试这个

    (\d+\.\d\sA)
    

    演示here

    【讨论】:

      猜你喜欢
      • 2018-09-08
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多