REGEX多行搜索2个字符 - Powershell

时间:2017-12-01 21:31:19

标签: regex powershell

我无法应用许多其他的PowerShell正则表达式解决方案来帮助解决我的问题。答案很可能已经在stackoverflow上了,但是我对PowerShell缺乏经验,这使我无法推断出如何对我的问题提出解决方案。 我有一个文本文件,其中包含一个XML文档树(我将文档树作为一个大字符串引入powershell)(编辑1),其中包含HTML标记以确定某些内容的位置。我需要从文件名标签之间窃取文件名。有时标签和文件名都在一行上,有时标签分别位于单独的行和文件名上。我输入数据的一个例子如下:

    <files>
    <file>
    <fileName>
    ThisTextFileINeedReturned.txt
    </fileName>
    <lastModifiedTime>1511883780000</lastModifiedTime>
    <size>852192</size>
    <isDirectory>false</isDirectory>
    <isRegularFile>true</isRegularFile>
    <isSymbolicLink>false</isSymbolicLink>
    <isOther>false</isOther>
    <group>group</group>
    <transferStatus>Done</transferStatus>
    </file>
    <file>
    <fileName>AnotherTextFileINeedReturned.txt</fileName>
    <lastModifiedTime>1511883780000</lastModifiedTime>
    <size>852192</size>
    <isDirectory>false</isDirectory>
    <isRegularFile>true</isRegularFile>
    <isSymbolicLink>false</isSymbolicLink>
    <isOther>false</isOther>
    <group>group</group>
    <transferStatus>Done</transferStatus>
    </file>

到目前为止,我创建了以下代码来查找代码中的内容。如果文件名标签和文件名在同一行,它可以工作。我遇到的问题是在他们都处于单独行的情况下(我在上面提供的示例)。我已经设法将上面的大字符串传输到$ xmldata。

$xmldata -match '<fileName>(.*?)(</fileName>)'
$matches

使用上面显示的示例文本,我收到的输出如下:

    <fileName>AnotherTextFileINeedReturned.txt</fileName>

接收标签我很好,但我还需要多行文件的名称。像这样......

    <fileName>
    ThisTextFileINeedReturned.txt
    </fileName>
    <fileName>AnotherTextFileINeedReturned.txt</fileName>

或任何会给我两个文本文件名称的变体。我曾经看过以前使用的(?m)部件,但我无法成功实现它。在此先感谢您的帮助!!如果您需要任何其他信息,请与我们联系!

2 个答案:

答案 0 :(得分:0)

你应该能够在不使用任何正则表达式的情况下绕过它。 Powershell非常支持XML。提取文件名就像:

$Xml = @"
<files>
    <file>
        <fileName>
            ThisTextFileINeedReturned.txt
        </fileName>
        <lastModifiedTime>1511883780000</lastModifiedTime>
        <size>852192</size>
        <isDirectory>false</isDirectory>
        <isRegularFile>true</isRegularFile>
        <isSymbolicLink>false</isSymbolicLink>
        <isOther>false</isOther>
        <group>group</group>
        <transferStatus>Done</transferStatus>
    </file>
    <file>
        <fileName>AnotherTextFileINeedReturned.txt</fileName>
        <lastModifiedTime>1511883780000</lastModifiedTime>
        <size>852192</size>
        <isDirectory>false</isDirectory>
        <isRegularFile>true</isRegularFile>
        <isSymbolicLink>false</isSymbolicLink>
        <isOther>false</isOther>
        <group>group</group>
        <transferStatus>Done</transferStatus>
    </file>
</files>
"@

Select-Xml -Content $Xml -XPath "//files/file/fileName" | foreach {$_.node.InnerXML.Trim()}

答案 1 :(得分:0)

您没有说明如何获取数据,但我猜您使用Get-Content来检索源文件。 Get-Content一次读取一行内容并返回一组对象,每个对象代表一行内容。换句话说,您可能在每条单独的行上都执行了Match,因此找不到分布在多行上的匹配。
如果确实如此,那么解决方案就是首先简单地加入这些行:

($xmldata -Join "") -match '<fileName>(.*?)(</fileName>)'

检查你的比赛,例如:

$Matches[0]