【发布时间】:2022-01-27 19:21:19
【问题描述】:
我的任务是在整个文件结构中搜索 SSN(以及其他 PII,以便我们可以将其删除),我知道这很有趣。到目前为止,此脚本将搜索给定目录中的所有 .xlsx 文件,但无论我尝试什么,我都无法让 $SearchText 变量工作。我已经尝试了当前显示的正则表达式的许多不同偏差,唯一有效的正则表达式字符串是直问号; "???????????",但这会返回我不想要的整体。
非常感谢任何帮助。
谢谢!
$SourceLocation = "C:\Users\nick\Documents\ScriptingTest"
$SearchText2 = "^(?!(000|666|9))\d{3}-(?!00)\d{2}-(?!0000)\d{4}$"
$SearchText = "*"
$FileNames = Get-ChildItem -Path $SourceLocation -Recurse -Include *.xlsx
Function Search-Excel {
$Excel = New-Object -ComObject Excel.Application
$Workbook = $Excel.Workbooks.Open($File)
ForEach ($Worksheet in @($Workbook.Sheets)) {
$Found = $WorkSheet.Cells.Find($SearchText)
If ($Found.Text -match "SearchText2") {
$BeginAddress = $Found.Address(0,0,1,1)
[pscustomobject]@{
WorkSheet = $Worksheet.Name
Column = $Found.Column
Row =$Found.Row
Text = $Found.Text
Address = $File
}
Do {
$Found = $WorkSheet.Cells.FindNext($Found)
$Address = $Found.Address(0,0,1,1)
If ($Address -eq $BeginAddress) {
BREAK
}
[pscustomobject]@{
WorkSheet = $Worksheet.Name
Column = $Found.Column
Row =$Found.Row
Text = $Found.Text
Address = $File
}
} Until ($False)
}
}
}
$workbook.close($false)
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$excel)
[gc]::Collect()
[gc]::WaitForPendingFinalizers()
Remove-Variable excel -ErrorAction SilentlyContinue
foreach ($File in $FileNames)
{
Search-Excel
}
编辑:原来 excel 可接受的正则表达式范围非常有限:Acceptable Excel Regex, 所以我将第一个 $Searchtext viarable 修改为“*”,并将第一个 if 语句修改为匹配 excel 搜索之外的正则表达式。现在我只需要想出一个巧妙的正则表达式模式来过滤我想要的东西。下一个问题是过滤:
- 没有字母。
- 带破折号的有效 SSN。
- 不带破折号的有效 SSN。 (这部分让我很困惑,如何搜索可以有破折号的东西,但如果没有,它只能是 9 个字符长)
【问题讨论】:
-
刮取/耕种社会安全号码?
\d\d\d-\d\d-\d\d\d\d -
这也不起作用:(
-
适用于我的 SSN。我从未见过没有破折号的 SSN
-
如果搜索文本
"???????????"有效,则 Excel 不得使用传统正则表达式,因为这将无效或匹配零个字符。这看起来更像是通配符语法。你能找到任何关于 Excel 如何解释你传递给Find的字符串的文档吗?我找到了this documentation forRange.Find,但我不确定是不是同一个方法,而且那个页面没有描述What参数是如何解释的。 -
至少
???-??-????应该可以使用通配符。仅供参考forum.aspose.com/t/cells-find-doesnt-work-with-regex/71225
标签: regex powershell