除了Powershell之外,Regex可以在任何地方使用(尝试regex101和regstorm.net)

我已经尝试了各种不同的组合,已经检查了其他类似的post,但找不到我的答案。 我有一个.config文件,当我执行search时,我需要从文件中排除注释,如下所示:

(Get-Content C:\Path\File.config -Raw) | Select-String '(<!--((?!-->)(.|\n))*-->)' -AllMatches 

我也尝试了下面的正则expression式

 (?smi)^\<!--.*?--\>? 

这两个工作在regex101和regex.net上,但对Powershell完全不起作用。 这是我的.config文件的外观:

 Test <!--<add name= /> <add name= /> <add name= />--> <add name= /> <!--<add name= /> <add name= />--> Test Test 

我已经确定我正在使用我的获取内容 – 也尝试了外串。 除了powershell之外,这些正则expression式都可以工作。 你的帮助是适当的赞赏

当Powershell内置完美的XMLparsing器时,为什么要使用Regex手动parsingXML?

要从现有XML文件中删除注释,请parsing文件,使用XPathexpression式查找所有注释,将其删除,然后像下面这样保存文件:

 $xml = [xml](Get-Content C:\Path\File.config) # You might need to tweak the XPath expression for your file, # but this works for me on a random .NET app.config $comments = $xml.SelectNodes('descendant::comment()') $comments | %{ $_.ParentNode.RemoveChild($_) | out-null } $xml.Save('C:\Path\File-output.config') 

但是,这听起来似乎甚至是你想要做的事情矫枉过正。

我正在尝试输出文件没有任何意见。 然后,我将使用这个输出没有评论,并使用这些数据创build一个csv。

在这种情况下,为什么不直接玩parsing的XML,只是忽略注释。 一旦你使用上面的例子中的第一行parsing了文件,就可以得到一个完美的XML对象,其中包含所有可以查询,处理和输出为CSV的数据。 您不应该先导出没有评论的文件。

如果您需要一些帮助来了解如何在Powershell中使用XML数据,那么可以从网上find数以千计的文章。 Google在这里是你的朋友。

(<!--((?!-->)(.|\r\n))*-->)在Windows上使用Notepad ++。

我相信\n在某些操作系统和大多数网站上都是必需的,但在Windows上需要\r\n 。 显然,每个操作系统对换行符的处理方式略有不同。

更新:2017/08/16 12:39

这似乎适用于我:( (Get-Content C:\Path\File.config -Raw) | Select-String '(<!--((?!-->)(.|\n))*-->)' -AllMatches | ForEach { $_.Matches.Value } (Get-Content C:\Path\File.config -Raw) | Select-String '(<!--((?!-->)(.|\n))*-->)' -AllMatches | ForEach { $_.Matches.Value }