在带正则表达式的引号内查找字符串

时间:2019-09-09 17:26:14

标签: regex powershell

我想在网络交换机配置的行中找到一个用引号引起来的密码,但是它不起作用。有人可以帮忙吗?例如:我在配置中有一行:

set snmp v3 usm local-engine user Admin authentication-sha authentication-key "$aBCd./!Test" 

我这样写了一个Regex语句,但是它不起作用。

^set\s\snmp\sv3\s\usm\slocal-engine\suser\sAdmin\sAuthentication-sha\sauthentication-key\s[0-9A-Za-z$./!.*+]     

^set\s\snmp\sv3\s\usm\slocal-engine\suser\sAdmin\sAuthentication-sha\sauthentication-key\s[0-9A-Za-z$./!.*+]     

什么都不显示

2 个答案:

答案 0 :(得分:0)

在您的模式中,转义\u\s和一些多余的空格时会出现一些错误。

您可以使用+重复character class 1次以上并使用捕获组

要同时匹配Authentication,可以不区分大小写,使用大写字符或使用[aA]来匹配两者。

^set\ssnmp\sv3\susm\slocal-engine\suser\sAdmin\sAuthentication-sha\sauthentication-key\s"([0-9A-Za-z$./!.*+]+)"

Regex demo | Powershell demo

如果双引号应作为结果的一部分,则可以将其添加到捕获组中。

("[0-9A-Za-z$./!.*+]+")

enter image description here

例如

$Str = 'set snmp v3 usm local-engine user Admin authentication-sha authentication-key "$aBCd./!Test" '
$Pattern = '^set\ssnmp\sv3\susm\slocal-engine\suser\sAdmin\sAuthentication-sha\sauthentication-key\s("[0-9A-Za-z$./!.*+]+")'
$match = $Str -match $Pattern
$Matches[1] # First capturing group

输出

"$aBCd./!Test"

答案 1 :(得分:0)

这将匹配双引号之间的所有内容,但假定只有一对这样的对。捕获的组位于$Matches自动变量@索引1中。

$InStuff = 'set snmp v3 usm local-engine user Admin authentication-sha authentication-key "$aBCd./!Test"'

$Null = $InStuff -match '.+"(.+)"'

$Matches[1]

output = $aBCd./!Test