如何在正则表达式中获得2场比赛?

时间:2014-10-28 15:17:51

标签: regex powershell

我的xml文件格式如下:

<User>
<FirstName>Foo Bar</FirstName>
<CompanyName>Foo</CompanyName>
<EmailAddress>bar@foo.com</EmailAddress>
</User>
<User>
...

我想阅读所有xml文件,创建为输出<CompanyName>,<EmailAddress>,所以:

Foo,bar@foo.com
User2,user@email.com
Blah,blah@blah.com

我正在使用以下代码段:

$directory = "\\PC001\Blah"


Function GetFiles ($path) {
    foreach ($item in Get-ChildItem $path) {
        if ( Test-Path $item.FullName -PathType Container) {
            GetFiles ($item.FullName)
        } else {
            $item
        }
    }
}


Foreach ($file in GetFiles($directory)) {
    If ($file.extension -eq '.test') {
        $content = Get-Content $file.fullname
        $pattern = '(?si)<CompanyName>(.*?)</CompanyName>\n<EmailAddress>(.*?)</EmailAddress>'
        $matches = [regex]::matches($content, $pattern)

        foreach ($match in $matches) {
            $matches[0].Value -replace "<.*?>" 
        }    
    }
}

但是,$matches为空,所以我的正则表达式有问题。如果我遗漏\n<EmailAddress>(.*?)</EmailAddress>,它就可以了。我做错了什么?

2 个答案:

答案 0 :(得分:2)

$pattern = '(?si)<CompanyName>(.*?)</CompanyName>\s*<EmailAddress>(.*?)</EmailAddress>'

试试这个。\s将确保涵盖所有空格和换行符。

答案 1 :(得分:1)

该文件中可能存在\r个字符。所以改变你的正则表达式如下,

$pattern = '(?si)<CompanyName>(.*?)</CompanyName>[\n\r]+<EmailAddress>(.*?)</EmailAddress>'

OR

$pattern = '(?si)<CompanyName>(.*?)</CompanyName>.*?<EmailAddress>(.*?)</EmailAddress>'