2017-03-02 103 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

相關問題