【问题标题】:Powershell regex refusing to run on multiple linesPowershell正则表达式拒绝在多行上运行
【发布时间】:2015-01-15 23:05:48
【问题描述】:

我有一个正则表达式,当我使用各种在线正则表达式测试站点时,它会返回正确的结果。但是,当我在 PowerShell 脚本中使用正则表达式时,它只返回一行而不是多行。我希望这里的 PowerShell 专家能告诉我我做错了什么。我正在使用 PowerShell v1。

这是我的正则表达式: https://regex101.com/r/eA5jB2/3

这是我的 powershell 脚本:-

#Read the file 
$FilePath = "testfile.txt" 

$regex = '(?msi)^0[12][VM](?:[^\n]|\n(?!0[12][VM]|50|90))+'
get-content $FilePath | select-string -pattern $regex 

返回单行

01Mxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  01 01 01

而不是

01Mxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 01 01 01
01=0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
01=5xxxxxxxxxxxxxxxxxxxxxxxxxxx

【问题讨论】:

    标签: regex powershell


    【解决方案1】:

    问题出在Get-Content cmdlet 中,因为它返回一个行数组,因此您无法匹配除以换行符的文本。

    尝试使用其他方法获取文件内容:

    [IO.File]::ReadAllText($FilePath)
    Get-Content $FilePath -Raw
    Get-Content $FilePath | Out-String
    

    你可以找到类似的问题here

    【讨论】:

    • 谢谢,但是当我尝试第一个和最后一个方法时,我的脚本会返回所有可能的行,而 powershell v1 不支持第二个。当我执行“get-content $filepath | out-string >temp.txt”并将文件复制到在线正则表达式测试站点时,所有方法都可以正常工作。
    • @user3046742 这些方法仅用于以您可以应用正则表达式的方式读取文件。您仍然需要将其通过管道传输到 Select-String
    【解决方案2】:

    我认为问题在于使用 Select-String。

    $text = 
    @'
    00 date
    01Mxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    01 01 01 01=0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    01=5xxxxxxxxxxxxxxxxxxxxxxxxxxx
    01Mxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    01 01 01 01=0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    01=9xxxxxxxxxxxxxxxxxxxxxxxxxxx
    50 xxxxxxxxxxxxx xxxxxxxxxxxxxxxxx
    01Vxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    01$1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    01$A xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    01$B 0xxxxxxxxxxxxxxxxxxxx
    01$0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    01$5xxxxxxxxxxxxxxxxxxxxxxxxxxx
    50 xxxxxxxxxxxx BatchTotal
    90 xxxxxxxxxxxx FILETotal
    '@ 
    
    $regex = '(?msi)^0[12][VM](?:[^\n]|\n(?!0[12][VM]|50|90))+'
    
    
    [regex]::matches($text,$regex) |
     foreach {$_.groups[0].value;'***'}
    
    01Mxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    01 01 01 01=0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    01=5xxxxxxxxxxxxxxxxxxxxxxxxxxx
    ***
    01Mxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    01 01 01 01=0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    01=9xxxxxxxxxxxxxxxxxxxxxxxxxxx
    ***
    01Vxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    01$1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    01$A xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    01$B 0xxxxxxxxxxxxxxxxxxxx
    01$0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    01$5xxxxxxxxxxxxxxxxxxxxxxxxxxx
    ***
    

    【讨论】:

    • 效果很好!当我使用“$text = get-content $FileName | out-string. 问题解决了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多