0

我有一个内容如下所示的文件:

[Something1Something2]
 - Interesting data 1
 - Interesting data 2

[Something3]
 - Interesting data 1
 - Interesting data 2

[Something4]
 - Interesting data 1
 - Interesting data 2

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

$myStringArray[0]

prints:

 - Interesting data 1
 - Interesting data 2

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

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

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

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

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

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

4

2 回答 2

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
}

如果有人有更巧妙的方法,我真的很想看到它:)。

亲切的问候

于 2012-09-26T21:11:08.543 回答
0

试试这个正则表达式:

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

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

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

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

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

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

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

如果你想包含搜索字符串,你需要给我们一个前瞻,像这样:

[regex]::Split($myfile,"(?=(?mi)^\[.*\]{1}\s)")
于 2012-09-26T23:11:09.507 回答