按标题将文件内容拆分为组

时间:2012-09-26 13:24:34

标签: regex split powershell-v2.0

我的文件内容如下:

[Something1Something2]
 - Interesting data 1
 - Interesting data 2

[Something3]
 - Interesting data 1
 - Interesting data 2

[Something4]
 - Interesting data 1
 - Interesting data 2

我想使用spilled或其他一些我未知的命令来获取返回的部分,然后我可以像这样索引:

$myStringArray[0]

prints:

 - Interesting data 1
 - Interesting data 2

我试图通过使用正则表达式实现这一点,但没有运气:

"[Somthing1] somedata1 [Something2] somedate2" -split "\[(.*)\]"

我意识到这不是多线的,但是原理是相同的,仅用于测试。

如果我使用上述文件执行此操作以尝试使用多行:

$myfile = Get-Content .\test.txt
($myfile -split "\[.*\]")

我得到一个包含14个而不是3个条目的数组。

2 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,但不是一个很好的解决方案:

Function GetEntriesMatching($filename, $tagMatch)
{
    Write-Host "Filename: $filename"
    Write-Host "Tag: $tagMatch"

    $regex = "\[.*($tagMatch).*\]"
    Write-Host "Regex: $regex"

    $Lines = Get-Content $filename
    $Out = $False
    $returnValue = @()

    ForEach ($Line In $Lines)
    {
        If ($Line -match '\[.*\]') {$Out = $False}
        If ($Out -eq $True) {$returnValue += "<br> $Line </br>"}
        If ($Line -match $regex) {$Out = $True}
    }

    if($returnValue.Count -eq 0)
    {
        $returnValue += "<b>NO ENTRIES FOUND FOR $tagMatch</b>"
    }

    return $returnValue
}

如果有人有这样做的方式,我真的很想看到它:)。

亲切的问候

答案 1 :(得分:0)

试试这个正则表达式:

(?mi)^\[.*\]{1}\s

要导入文件,请尝试以下操作:

$myfile = [io.file]::ReadAllText(".\test.txt")

这会将文件作为单个值导入,而不是get-content返回的数组。

从那里你应该能够做到这一点:

[regex]::Split($myfile,"(?mi)^\[.*\]{1}\s")

这不包括拆分中的搜索字符串。

如果你想要包含搜索字符串,你需要我们一个前瞻,如下所示:

[regex]::Split($myfile,"(?=(?mi)^\[.*\]{1}\s)")