我正在尝试使用正则表达式来匹配文件中的某些行,但我遇到了一些麻烦。
该文件包含如下文字:
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}
仍然没有运气......
答案 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 = 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}