PowerShell正则表达式 - 带有通配符和逗号的单词

时间:2017-03-31 04:15:17

标签: regex powershell

尝试替换我所理解的简单操作但是撞墙。

我可以用逗号替换一个单词:

$firstval = 'ssonp,RDPNP,LanmanWorkstation,webclient,MfeEpePcNP,PRNetworkProvider'

($firstval) -replace 'webclient+,',''
  

ssonp,RDPNP,LanmanWorkstation,MfeEpePcNP,PRNetworkProvider

但是还没有弄清楚如何在单词中添加通配符,或者我如何通过逗号继续使用通配符的多个单词,例如:

  

w * client +,* fee *等

(添加的空格不再被解释为问题中的格式)

玩了一些渗透,并尝试使用其他问题的例子而没有任何运气。

1 个答案:

答案 0 :(得分:2)

-replace运算符将正则表达式作为其第一个参数。你似乎混淆了通配符和正则表达式。您的模式w*client+,*fee*,虽然是有效的正则表达式,但似乎打算使用通配符。

*通配符的正则表达式为.*,其中.表示"任何字符"并且*表示" 0次或更多次出现"。因此,w*client,的正则表达式为w.*client,,类似地,*fee*,的正则表达式将为.*fee.*,。但是,由于要搜索的字符串具有逗号分隔值,因此我们不希望我们的模式包含"任何字符" (.*)而是#34;任何字符,但逗号" ([^,]*)。因此,要使用的模式分别为w[^,]*client,[^,]*fee[^,]*,

要搜索字符串中的两个单词,请使用|分隔这两个模式。下面构建了这样一个模式,并针对不同位置匹配的字符串对其进行测试:

# Match w*client or *fee*
$wordPattern = 'w[^,]*client|[^,]*fee[^,]*';
# Match $wordPattern and at most one comma before or after
$wordWithAdjacentCommaPattern = '({0}),?|,({0})$' -f $wordPattern;

"`$wordWithAdjacentCommaPattern: $wordWithAdjacentCommaPattern";
# Replace single value
'webclient', `
# Replace first value
'webclient,middle,last', `
# Replace middle value
'first,webclient,last', `
# Replace last value
'first,middle,webclient' `
    | ForEach-Object -Process { '"{0}" => "{1}"' -f $_, ($_ -replace $wordWithAdjacentCommaPattern); };

这输出以下内容:

$wordWithAdjacentCommaPattern: (w[^,]*client|[^,]*fee[^,]*),?|,(w[^,]*client|[^,]*fee[^,]*)$
"webclient" => ""
"webclient,middle,last" => "middle,last"
"first,webclient,last" => "first,last"
"first,middle,webclient" => "first,middle"

您可能会考虑的非正则表达式替代方法是将输入字符串拆分为单个值,过滤掉与某些通配符匹配的值,然后将其左侧重新组合为逗号分隔值:

(
    'ssonp,RDPNP,LanmanWorkstation,webclient,MfeEpePcNP,PRNetworkProvider' -split ',', -1, 'SimpleMatch' `
        | Where-Object { $_ -notlike 'w*client' -and $_ -notlike '*fee*'; } `
) -join ',';

顺便说一句,您使用正则表达式webclient+,来匹配并从字符串中删除文本webclient,(看起来像HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order\ProviderOrder注册表值)。只需注意,+会搜索文字文本webclien,然后搜索一次或多次t后跟文字文本,。因此,这将与webclientt,webclienttt,webclientttttttttt,等匹配webclient,。如果您只想匹配webclient,,那么您可以使用模式webclient,(无+)。