2017-03-02 104 views
1

我有一个很大的文本文件,其中包含括号内的单引号字符串。正则表达式分割成部分然后匹配字符串

[ 
'stringIneedToExtractBetweenSingleQuotes' some other 
text 
and 
characters asdasf/*- 'AnotherStringIneedToExtract' 
] 

[ 
'anotherstring' some other 
text and characters asdasfds/*- 'PleaseExtractMe' 
] 

[...] 

我想获得引号之间的字符串由括号分隔,像数组索引分离的部分,

$array[0]$matches[0]

stringIneedToExtractBetweenSingleQuotes 

AnotherStringIneedToExtract 

$array[1]$matches[1]

anotherstring 

PleaseExtractMe 

使用'(.*?)'我可以提取所有单引号之间的字符串,但我不知道哪一个很有意义的使用:

  1. 使用PowerShell .split(']')方法分裂文成数组,然后使用'(.*?)'提取字符串。

  2. 最好的方法(如果可能的话),使用正则表达式提取这些字符串,并使用[]作为分隔符分割成部分。

+0

我不认为你需要拆分字符串,只需使用捕获组运行正则表达式后。 https://mcpmag.com/articles/2015/09/30/regex-groups-with-powershell.aspx –

+0

_pretty大文本文件_是主观的。你能用数字或者行或者平均文件大小来量化吗? – Matt

+0

文件中是否有任何单引号字符串_outside_括号?还是确实不需要考虑括号的存在? – Matt

回答

0

因为它是一个大的文件,我会用Get-Content-Readcount减少I/O操作。然后你可以使用链式-match-replace作为数组操作符过滤,然后提取所需的数据:

$ExtractedLines= 
Get-Content .\testdata.txt -ReadCount 1000 | 
ForEach-Object {$_ -match ".*'.+'.*" -replace ".*'(.+)'.*",'$1'} 

编辑:

如果你想保留在方括号:

$ExtractedLines= 
Get-Content .\testdata.txt -ReadCount 1000 | 
ForEach-Object {$_ -match ".*'.+'.*|[\[\]]" -replace ".*'(.+)'.*",'$1'} 

然后用方括号作为分隔符分割。

+0

谢谢@mjolinor 我刚刚得到了很多真假输出,请问为什么要使用-replace和替换中的$ 1变量是什么? – Gareth

+0

您是否在Get-Content上使用-ReadCount 1000选项?如果没有这个(或者默认情况下的ReadCount为1),您将得到真/假回报。我正在使用-replace删除单引号之外的所有文本。 $ 1表示第一个捕获组,这是单引号内的文本。 – mjolinor

+0

很酷,谢谢。现在它适用于-ReadCount 现在,你知道如何使用括号对字符串进行分组吗?例如$ array [0]将包含第一个括号之间的字符串,目前我使用下面的方法对括号内的字符串进行分组, ] | select-string -pattern'(。*?)'-AllMatches | foreach {$ _. matches.value}' 这给了我第一个[] – Gareth

相关问题