【问题标题】:RegEx Split into sections then match strings正则表达式拆分为部分然后匹配字符串
【发布时间】:2017-03-02 13:19:10
【问题描述】:

我有一个非常大的文本文件,其中包含括号之间的单引号字符串。

[
'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. 最喜欢的方式(如果可能的话),使用正则表达式提取这些字符串并使用 [ ] 作为分隔符分割成多个部分。

【问题讨论】:

  • 我认为您不需要拆分字符串,只需在运行正则表达式后使用捕获组即可。 mcpmag.com/articles/2015/09/30/…
  • 相当大的文本文件是主观的。你能用数量或行数或平均文件大小来量化吗?
  • 文件中的括号是否有任何单引号字符串?或者是否真的不需要考虑括号的存在?
  • Tamás,感谢您的文章,我已经使用了 $matches[...] 变量,但它分别为我提供了每个匹配项。我想让它们每个 [ ] 部分而不是每个字符串匹配。 @Matt 文件大小约为 95-100 MB,括号外没有单引号或任何文本。我想我可以使用括号作为边界,将每个带引号的字符串放在括号内,然后保存到数组中,并将每个部分与数组索引一起使用。因此,我可以使用 $array[0] 或 $matches[0] 访问第一个括号之间的引号字符串,使用 $array[1] 或 $matches[1] 访问第二个括号等等。
  • 那么每个括号块中总是有一对带引号的字符串呢?

标签: regex powershell


【解决方案1】:

由于它是一个大文件,我会使用 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,replace中的$1变量是什么?
  • 您是否在 Get-Content 上使用 -ReadCount 1000 选项?没有它(或默认值为 1 的 ReadCount),您将获得真/假返回。我正在使用 -replace 删除单引号之外的所有文本。 $1 代表第一个捕获组,即单引号内的文本。
  • 酷,谢谢。现在它可以与 -ReadCount 一起使用 现在,您知道如何使用括号对字符串进行分组吗?例如 $array[0] 将包含第一个括号之间的字符串,目前我使用以下对括号之间的字符串进行分组,(Get-Content -raw .\text.log).split(']')[0] | select-string -pattern '(.*?)' -AllMatches | foreach {$_.matches.value} 这给了我第一个 [] 之间的匹配字符串
  • 你想让 $array[0] 成为另一个数组,还是只是一个多行字符串?
  • 其实,跟随单线就是我想要的。分隔每个括号然后获取带引号的字符串,因此我可以使用数组索引访问每个括号(字符串),例如 split(']')[14] 我使用的 Oneliner: (Get-Content -raw .\text.log).split(']')[0] | select-string -pattern "'(.*?)'" -AllMatches | foreach {$_.matches.value} 我的问题是,有没有更好的方法来做到这一点使用 PowerShell,或者是否可以在不使用 PS 拆分的情况下使用正则表达式做同样的事情?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多