正则表达式分割成部分然后匹配字符串
我有一个很大的文本文件,其中包含括号内的单引号字符串。正则表达式分割成部分然后匹配字符串
[
'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
使用'(.*?)'
我可以提取所有单引号之间的字符串,但我不知道哪一个很有意义的使用:
使用PowerShell
.split(']')
方法分裂文成数组,然后使用'(.*?)'
提取字符串。最好的方法(如果可能的话),使用正则表达式提取这些字符串,并使用[]作为分隔符分割成部分。
因为它是一个大的文件,我会用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'}
然后用方括号作为分隔符分割。
谢谢@mjolinor 我刚刚得到了很多真假输出,请问为什么要使用-replace和替换中的$ 1变量是什么? – Gareth
您是否在Get-Content上使用-ReadCount 1000选项?如果没有这个(或者默认情况下的ReadCount为1),您将得到真/假回报。我正在使用-replace删除单引号之外的所有文本。 $ 1表示第一个捕获组,这是单引号内的文本。 – mjolinor
很酷,谢谢。现在它适用于-ReadCount 现在,你知道如何使用括号对字符串进行分组吗?例如$ array [0]将包含第一个括号之间的字符串,目前我使用下面的方法对括号内的字符串进行分组, ] | select-string -pattern'(。*?)'-AllMatches | foreach {$ _. matches.value}' 这给了我第一个[] – Gareth
我不认为你需要拆分字符串,只需使用捕获组运行正则表达式后。 https://mcpmag.com/articles/2015/09/30/regex-groups-with-powershell.aspx –
_pretty大文本文件_是主观的。你能用数字或者行或者平均文件大小来量化吗? – Matt
文件中是否有任何单引号字符串_outside_括号?还是确实不需要考虑括号的存在? – Matt