【问题标题】:PowerShell Regular Expression Multiline [duplicate]PowerShell正则表达式多行[重复]
【发布时间】:2016-01-17 16:37:04
【问题描述】:

我想匹配文本文件中的以下多行。

[1750256247]
;Rev: B,5

我尝试跟随,但未能成功。你能帮帮我吗?

$fileContent | Select-String "(?smi)(^[1750256247](-|\s*$))(^;Rev: B,5$)" -AllMatches | Foreach {$.Matches} | Foreach {$.Value}

【问题讨论】:

  • 你也可以使用$fileContent | Select-String "(?i)\[1750256247][-\s]*;Rev: B,5" -AllMatches | Foreach {$_.Matches} | Foreach {$_.Value}
  • npinti 对我​​也不起作用。你试过$fileContent | Select-String "(?i)\[1750256247][-\s]*;Rev: B,5" -AllMatches | Foreach {$_.Matches} | Foreach {$_.Value}吗?顺便说一句,您是指\r\n 换行符还是<br>
  • 嗨 stribizhev,是的,我也试过你的。同样的事情发生了。我不明白为什么。我的意思是 [CR][LF]
  • 可能是因为问题不清楚?
  • 字符串如下:[1750256247][CR][LF];Rev: B,5[CR][LF]

标签: regex windows powershell multiline


【解决方案1】:

不完全 100% 确定您在追求什么,但将您的表达式更改为:(?smi)(^\[1750256247\](.|-|\s*$))(^;Rev: B,5$)(例如 here)有效。

你的表达有一些问题:

  1. 在正则表达式语法中,[] 字符表示字符集,即引擎将尝试匹配其中一个字符的一组字符。如果您需要匹配实际的 [] 字符,则需要通过使用 \ 字符来转义它们。

  2. 您正在使用s 修饰符,因此允许句点字符也匹配换行符,但您没有使用句点字符。

编辑:根据@stribizhev 的建议,您可以使用(?smi)(^\[1750256247](.|-|\s*$))(^;Rev: B,5$)。我个人会选择第一个选项,因为我认为它更具可读性,但意见很可能会有所不同。

【讨论】:

  • 只有[ 应该在这里转义。 [ 必须在字符类之外转义,] 如果不在初始位置,则应在字符类内转义。
  • @stribizhev:所以\[foo] 将匹配[foo]
  • 是的,] 在大多数正则表达式风格中被消除为文字符号。在 Powershell 中,使用了 .NET 正则表达式,因此,它将像这样工作。
  • 您好 npinti,感谢您的快速回复。 “[1750256247]”之后有一个换行符。然后在嵌套行的开头出现“;Rev: B,5”。我试过你写的,但没有用。
  • @stribizhev:我明白你的意思。你不认为它会妨碍可读性吗?
【解决方案2】:

如果您在此处的字符串中构建正则表达式并嵌入换行符,我发现多行正则表达式更易于编写且阅读更直观。

$regex = @'
(?ms)\[1750256247\]\s*
;Rev: B,5\s*
'@

只需将您尝试匹配的文字字符串粘贴到正则表达式中,然后根据需要转义并为尾随空格等内容添加元字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 2013-04-15
    • 2014-03-21
    • 1970-01-01
    相关资源
    最近更新 更多