如何使用PowerShell匹配字符串中的精确数字?

时间:2015-04-14 20:39:53

标签: regex powershell

我编写了一个脚本来获取单个端口上的端口信息。脚本管道&netstat -anob'然后使用Where-Object扫描对象以获取确切的端口号并吐出所需的信息。

不幸的是,我使用的唯一获得肯定结果的条件参数是-match。但它也会产生误报。

$netstatport = $netstat | Where-Object { $_ -match $port }

如果我搜索的端口是例如555,则找到该信息。但是如果$ port等于55,也会发现相同的信息。换句话说,我需要的是:

$ port = 55>>假

$ port = 555>>真

$ port = 5555>>假

我尝试过各种条件,例如-eq,-ieq,=等等。只有-match有效,但它太不精确了。

我错过了什么?

3 个答案:

答案 0 :(得分:2)

您可以使用\b匹配字边界:

$netstatport = $netstat | Where-Object { $_ -match "\b$port\b"} 

这样,如果仅传递555,则不会与555555匹配。

答案 1 :(得分:0)

-match运营商支持

Regular expressions

$port = 55
$regex= ":$port\s"
$netstat = Where-Object { $_ -match $regex}

打破正则表达式:

  • : - 表示netstat输出中端口分隔符的字符
  • $port - 包含您指定的端口号的变量
  • \s - 端口号后面的单个空格

请注意,此模式将返回与本地和外部IP地址/端口号匹配的值。

答案 2 :(得分:0)

您应该小心使用参数/用户输入并直接在正则表达式中使用它,因为任何特殊字符都将被解释,并且您无法预测哪些将出现。

因此,您应该使用[RegEx]::Escape()

进行转义
$escPort = [RegEx]::Escape($port)
$netstat | Where-Object { $_ -match "\b$escPort\b" }

(这使用\b,但如果您想使用更具体的内容(如其他答案),则原则相同。