如何在PowerShell中使用Regex

551 阅读2分钟

正则表达式regex对于初学者来说,理解起来可能很复杂,但却是一种非常有效的与字符串交互的技术。regex语言是一种强大的模式描述捷径,用于解析和匹配文本。PowerShell以各种方式使用正则表达式。由于PowerShell的命令或cmdlets是如此紧密地结合在一起,所以很容易忘记使用regex。也许,你不知道其中一些命令已经在使用regex。

PowerShell可以处理对象流,而不仅仅是文本。然而,它在文本处理方面的能力是比较强的。如果你做任何与文本处理有关的工作,你就会知道regex是任何编程语言中最重要的概念之一。在这篇文章中,将向你展示如何在PowerShell中使用regex。所以,让我们开始吧!

什么是PowerShell中的REGEX?

雷格函数是一个特殊的字符序列,它利用特殊的语法来帮助你寻找或匹配字符串或一组字符串。Regex能够搜索、编辑和操作数据和文本。这个表达式指示引擎匹配所提供的文本。

现在,我们将看看在PowerShell中使用REGEX的方法。

PowerShell中带有字符字面的Regex

首先,我们将通过使用"-match"操作符来执行一个正则表达式。这个操作符为模式匹配目的接受一个正则表达式,如果模式匹配则返回"$true"

现在,我们将执行我们的第一个正则表达式,其中我们将检查 "book"是否与模式 "ok"匹配。

> 'book' -match 'ok'

这个表达式将返回 "true**",因为书中含有字符串 "ok"(**"Bo[ok]")。

PowerShell中带有字符组的Regex

接下来,我们将使用**[字符组]来一次匹配多个字符。在下面的例子中,我们使用了 "b[iog]"这个词组来与 "big"匹配。**执行这个词条将检查 "big "中 "b"和 "g"之间的字符是否与 "b[iou]g "词条中的字符组"[iou]"相匹配。

> 'big' -match 'b[iou]g'

在下一条语句中,我们添加了 "book",它不匹配指定的重合词。执行它,让我们看看这个语句会显示什么结果。

> 'book' -match 'b[iou]g'

这个表达式将返回 "false",因为 "book"与重码 "b[iou]g"不匹配。

PowerShell中带有各种模式的Regex

一个模式可以是一个字符的集合。字符可以是数字[0-9],或基于ASCII的[ -~],或字母[A-Z]。

> 42 -match '[0-9][0-9]'

这个表达式将返回真,因为模式匹配任何两位数的数字 "42",在我们的例子中。

任何十进制数字都将匹配"\d"字符类。另一方面,"\D"将匹配任何非十进制的数字。

> 'Server-01' -match 'Server-\d\d'

上面给出的表达式如果匹配了一个介于(Server-01 - Server-99)之间的服务器名称,那么它将返回true。

任何单词字符"[a-z A-Z 0-9]"将被"\w"字符类匹配。利用"\W"来匹配任何非单词字符。

> 'Book' -match '\w'

执行上面给出的表达式将返回true,因为模式 "Book"匹配第一个字的字符 "B"

在regex中,句号"(.)"被认为是一个通配符。除了新行,它将匹配任何字符"(/n)"。下面给出的表达式将返回true,因为模式"[a1\]"匹配四个字符。

> 'a1\ ' -match '....'

"\s"字符类是用来匹配空白的。而"\S"或可用于匹配非空白字符。

> ' - ' -match '\s- '

执行上面给出的表达式将返回 "true",因为模式"[-]"使用了两种方法来匹配空格。

PowerShell中带有量化因子的Regex

量化器处理每个元素在输入字符串中出现的次数。PowerShell中可用的一些量化指标如下。

  • [*]用于指定任何元素的出现为 "零次或多次"。
  • [+]用于指定任何元素的出现为 "一次或多次"。
  • [?]用于指定任何元素的出现为 "一次或零次"。
  • [n]用于指定任何元素的出现都是 "n次"。
  • {n,m}用于指定任何元素的出现为 "至少n次,但不超过m次"。

下面给出的命令将对任何服务器名称返回真值,甚至是没有破折号的服务器名称。

> 'SERVER01' -match '[A-Z]+-?\d\d'

现在,我们将尝试用重词"\d{3}-\d{3}-\d{4}"来匹配一个电话号码。

> '111-222-3333' -match '\d{3}-\d{3}-\d{4}'

如果根据指定的模式找到一个正确的电话号码,该表达式将返回 "true"。

在下一部分,我们将在PowerShell脚本中使用regex。为此,首先,打开你的Windows PowerShell ISE,并创建一个新文件。

写出下面给出的用于数字和字符串匹配的代码。在这个脚本中,我们在"message"变量中存储了一个模式。在第二行中,这个"**message "**变量中存储了一个模式。在第二行中,这个"**message**"变量将通过使用"-match"操作符将其值与 "error"重合码匹配。我们还添加了一行代码用于数字模式匹配。

$message = 'there is an error with your file'
$message -match 'error'
'123-45-6789' -match '\d\d\d-\d\d-\d\d\d\d'

将此文件保存为 "testfile1.ps1"PowerShell脚本,并通过按 "运行"按钮执行。

这两种模式都与指定的regex相匹配,因此这个表达式在每种情况下都会返回 "true"

你也可以将一个regex与一个数组相匹配。为了证明这一点,我们在脚本中声明了一个数组"$data"。这个数组包含一些数字和字符串值。在向数组添加值之后,我们将把它与一个词组"**\d\d\d-\**d-\d-\d\d "相匹配。这个语句将检查数组中是否有任何数字值与正则表达式中指定的模式一致,并在PowerShell终端上打印出来。

$data = @(
           "This is some general text"
           "phone number is 333-99-2222"
           "another text statement"
           "phone number 444-44-4444"
       )
       $data -match '\d\d\d-\d\d-\d\d\d\d'


替换操作符利用regex进行模式匹配。这个操作符搜索一个模式,然后用命令中指定的其他模式替换它。例如,在下面给出的脚本中,我们有一个"$message "变量,包含一个字符串值 "嗨,我的名字是Sharqa"。我们想用 "Sharqa Hameed"替换 "Sharqa"。使用"-replace"操作符,我们将首先写出我们想要替换的模式,之后,我们将添加我们想要替换的模式。

$message = "Hi, my name is Sharqa"
$message -replace 'Sharqa','Sharqa Hameed'

保存这个 "testfile1.ps1"PowerShell脚本。执行这个脚本将输出"$message "变量的值,并将 "Sharqa"字符串替换为 "Sharqa Hameed"。

总结

在许多编程概念中,你可以使用regex,或者你可能已经在使用regex而没有意识到它。PowerShell在将regex功能融入其语言方面做得很好。

通过本文获得的知识,你应该能够在PowerShell中使用regex来匹配数字或文本模式,同时搜索高度复杂或特定的短语。我们还向你展示了如何在PowerShell脚本中使用regex量化器。