正则表达式匹配一个标签,跳过了几下,然后再配
问题描述:
我已经格式化这样的XML文件:正则表达式匹配一个标签,跳过了几下,然后再配
<User>
<FirstName>Foo Bar</FirstName>
<LastName>Blah</LastName>
<OtherStuff>...</OtherStuff>
<More>...</More>
<CompanyName>Foo</CompanyName>
<EmailAddress>[email protected]</EmailAddress>
</User>
<User>
...
我想通过所有的XML文件的读取,创建作为输出<FirstName>,<CompanyName>,<EmailAddress>
,所以:
Foo Bar,Foo,[email protected]
Name,User2,[email protected]
FSds,Blah,[email protected]
我利用的标签下面的正则表达式
(?si)<FirstName>(.*?)</FirstName>.*?<CompanyName>(.*?)</CompanyName>\s*<EmailAddress>(.*?)</EmailAddress>'
然而,这也返回一切FirstName
和CompanyName
我在做什么错?
答
为什么不使用XML处理?
C:\PS> $xml = [xml]@'
>>> <Users>
>>> <User>
>>> <FirstName>Foo Bar</FirstName>
>>> <LastName>Blah</LastName>
>>> <OtherStuff>...</OtherStuff>
>>> <More>...</More>
>>> <CompanyName>Foo</CompanyName>
>>> <EmailAddress>[email protected]</EmailAddress>
>>> </User>
>>> </Users>
>>> '@
C:\PS> "$($xml.Users.User.FirstName), $($xml.Users.User.CompanyName), $($xml.Users.User.EmailAddress)"
Foo Bar, Foo, [email protected]
您还没有显示完整的XML文档,所以我猜测在顶级节点上。您需要根据XML文档的结构进行调整。
+0
这是确定的快速和易于使用的方法。 – Matt 2014-10-28 17:27:32
答
我发现,如果你在下面的字符串建立它多行正则表达式可以更容易:
$String = @'
<User>
<FirstName>Foo Bar</FirstName>
<LastName>Blah</LastName>
<OtherStuff>...</OtherStuff>
<More>...</More>
<CompanyName>Foo</CompanyName>
<EmailAddress>[email protected]</EmailAddress>
</User>
'@
$regex = @'
(?ms).+?<FirstName>(.+?)</FirstName>.*?
<CompanyName>(.+?)</CompanyName>.*?
<EmailAddress>(.+?)</EmailAddress>.+?
'@
$string -match $regex > $null
$matches[1..3] -join ','
Foo Bar,Foo,[email protected]
如果它是一个大的文件,你不想读这一切在一次,你可以使用结束标记作为分隔符:
Get-Content xmlfile.xml -Delimiter '</User>' |
foreach {
if ($_ -match $regex)
{$matches[1..3] -join ','
}
为什么不考虑解析器来执行此任务? – hwnd 2014-10-28 16:53:16
我只是需要这个快速和肮脏的方法来工作,因为截止日期:P客户端是国王和所有:-) – Pr0no 2014-10-28 16:58:12
[不,你不](http://stackoverflow.com/a/1732454/1630171) 。 – 2014-10-28 20:47:46