4

我怎样才能让以下文本的输出只显示引号中的文本(不带引号)?

示例文本”

this is an "apple". it is red
this is an "orange". it is orange
this is an "blood orange". it is reddish

变成:

apple
orange
blood orange

理想情况下,如果可能的话,我想在一个班轮中完成。我认为这是带有 -match 的正则表达式,但我不确定。

4

3 回答 3

5

这是一种方法

$text='this is an "apple". it is red
this is an "orange". it is orange
this is an "blood orange". it is reddish'

$text.split("`n")|%{
$_.split('"')[1]
}

这是成功的解决方案

$text='this is an "apple". it is red
this is an "orange". it is orange
this is an "blood orange". it is reddish'

$text|%{$_.split('"')[1]}
于 2013-01-28T18:34:50.053 回答
3

使用正则表达式的另一种方式:

appcmd list apppool | % { [regex]::match( $_ , '(?<=")(.+)(?=")' ) } | select -expa value

或者

 appcmd list apppool | % { ([regex]::match( $_ , '(?<=")(.+)(?=")' )).value }
于 2013-01-28T19:25:48.087 回答
0

基于 .NET 方法的简洁解决方案[regex]::Matches(),使用 PSv3+ 语法:

$str = @'
this is an "apple". it is red
this is an "orange". it is orange
this is an "blood orange". it is reddish
'@

[regex]::Matches($str, '".*?"').Value -replace '"'

正则表达式".*?"匹配"..."- 封闭的标记并.Matches()返回所有它们;.Value提取它们,并-replace '"'剥离"字符。

这意味着上面甚至可以在每行使用多个 "..."标记(尽管请注意,使用嵌入的转义 "字符提取标记。(例如,\")将不起作用)。


仅在以下情况下才可以使用-match运算符(仅查找(一个)匹配项):

  • 你把输入分成几
  • 并且每行最多包含 1 个 "..."标记(对于问题中的示例输入来说是正确的)。

这是一个 PSv4+ 解决方案:

# Split string into lines, then use -match to find the first "..." token
($str -split "`r?`n").ForEach({ if ($_ -match '"(.*?)"') { $Matches[1] } })  

自动变量$Matches包含先前-match操作的结果(如果 LHS 是标量),索引[1]包含第一个(也是唯一的)捕获组 ( (...)) 匹配的内容。


如果-match有一个名为 的变体会很方便-matchall,这样人们就可以这样写:

# WISHFUL THINKING (as of PowerShell Core 6.2)
$str -matchall '".*?"' -replace '"'

请参阅GitHub 上的此功能建议。

于 2019-02-09T19:21:05.737 回答