尝试使用PowerShell中的正则表达式来匹配它

时间:2011-11-05 04:25:27

标签: regex powershell

我正在尝试使用正则表达式来匹配文件中的某些行,但我遇到了一些麻烦。

该文件包含如下文字:

Mario, 123456789
Luigi, 234-567-890
Nancy, 345 5666 77533
Bowser, 348759823745908732589
Peach, 534785
Daisy, 123-456-7890

我正在尝试将这些数字与XXX-XXX-XXX或XXX XXX XXX模式匹配。

我尝试了几种不同的方法,但它总是期望我不想要的东西或它告诉我一切都是假的。

我正在使用PowerShell执行此操作。

起初我试过了:

{$match = $i -match "\d{3}\-\d{3}\-\d{3}|\d{3}\ \d{3}\ \d{3}"
Write-Host $match}

但是,当我这样做时,它匹配数字的长数和XXX-XXX-XXXXX

我读到一些说n会匹配确切数量的东西,所以我尝试了......

{$match = $i -match "\d{n3}\-\d{n3}\-\d{n3}|\d{n3}\ \d{n3}\ \{n3}"
Write-Host $match}

这使一切都变得虚假......

所以我试过

{$match = $i -match "\d\n{3}\-\d\n{3}\-\d\n{3}|\d\n{3}\ \d\n{3}\ \d\n{3}"

我还尝试了懒惰量词,?

{$match = $i -match "\d{3?}\-\d{3?}\-\d{3?}|\d{3?}\ \{3?}\ \{3?}"
Write-Host $match}

还是假......

我尝试的最后一件事是......

{$match = $i -match "\d[0-9\{3\}\-\d[0-9]\{3\}\-\d[0-9]{3\}|\d[0-9]\{3\}\ \d[0-9]\{3}\ \d[0-9]\{3\}"<br>
Write-Host $match}

仍然没有运气......

6 个答案:

答案 0 :(得分:1)

以下模式给出了两个匹配项:

Get-Content .\test.txt | Where-Object {$_ -match '\d{3}[-|\s]\d{3}[-|\s]\d{3}'}

Luigi,234-567-890
雏菊, 123-456-7890

如果要排除上一个匹配项,请添加'$'锚点(表示字符串的结尾:

Get-Content .\test.txt | Where-Object {$_ -match '\d{3}[-|\s]\d{3}[-|\s]\d{3}$'}

Luigi,234-567-890

如果你想非常具体并且从头到尾匹配行(使用^ anchor,表示字符串的开头):

Get-Content .\test.txt | Where-Object {$_ -match '^\w+,\s+\d{3}[-|\s]\d{3}[-|\s]\d{3}$'}

Luigi,234-567-890

答案 1 :(得分:0)

你的第一个答案是最接近的。 {3}正好匹配3个字符。我认为你看到的n应该代表任何数字,而不是真正的n字符。它匹配长字符串的原因是您只指定匹配必须找到3位数,短划线或空格,3位数,短划线或空格,然后再找3位数。如果之后有更多数字,则没有指定它不计算。

如果在之后有数字时不匹配,您可以使用negative lookahead

(\d{3}-\d{3}-\d{3}|\d{3}\ \d{3}\ \d{3})(?!\d)

或者,如果您只想在该行的末尾匹配,可能还有尾随空格

(\d{3}-\d{3}-\d{3}|\d{3}\ \d{3}\ \d{3})\s*$

答案 2 :(得分:0)

试试这个:

/(\d+[- ])+\d+/

最好不要使用如此严格的正则表达式,除非你绝对确定你的输入不会改变。

所以这个正则表达式至少匹配一个数字,然后贪婪地搜索更多数字,后跟空格或短划线。这也是尽可能重复,然后是至少另一个数字。

答案 3 :(得分:0)

正如吉迪恩所说,你的第一个是最好的起点。

"\b\d{3}\-\d{3}\-\d{3}\b|\b\d{3}\ \d{3}\ \d{3}\b"

在每个语句之前和之后添加的\b特殊字符是单词边界 - 基本上是空格或换行符或标点符号,如句点或逗号。这可确保9999不匹配,但999.会匹配。

答案 4 :(得分:0)

在PowerShell中操作数据时,创建表示数据的对象通常是个好主意(毕竟,PowerShell是关于对象的)。基于对象属性的过滤通常更容易且更健壮。你的问题就是一个很好的例子。 以下是我们的目标:

  • 这些人:$ persons
  • 其中:其中
  • 该人数:$ _。number
  • 匹配: - 匹配
  • 模式
  • 以三位数字开头:^ \ d {3}
  • 后跟破折号或空格之间的三位数字 :( - \ d {3} - | \ \ d {3} \)
  • 以三位数结尾:\ d {3} $

以下是整个脚本:

$persons = import-csv -Header "name", "number" -delimiter "," data.csv
$persons | where {$_.number -match "^\d{3}(\-\d{3}\-|\ \d{3}\ )\d{3}$"}

答案 5 :(得分:0)

您还可以使用Select-String

Select-String '(\d{3}[ -]){2}\d{3}$' .\file.txt | % {$_.Line}