我怎样才能让以下文本的输出只显示引号中的文本(不带引号)?
示例文本”
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 的正则表达式,但我不确定。
我怎样才能让以下文本的输出只显示引号中的文本(不带引号)?
示例文本”
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 的正则表达式,但我不确定。
这是一种方法
$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]}
使用正则表达式的另一种方式:
appcmd list apppool | % { [regex]::match( $_ , '(?<=")(.+)(?=")' ) } | select -expa value
或者
appcmd list apppool | % { ([regex]::match( $_ , '(?<=")(.+)(?=")' )).value }
基于 .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
运算符(仅查找(一个)匹配项):
"..."
标记(对于问题中的示例输入来说是正确的)。这是一个 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 上的此功能建议。